1. 程式人生 > 實用技巧 >訓練賽後補題 10

訓練賽後補題 10

摘要:2020-07-01 個人訓練賽後補題

題號G,原題CodeChef - ECJN208

題目梗概:已知一堆小朋友的期末成績,要求即時得出一部分平均成績【向上取整】

//----------------當時沒看懂題,看樣例以為是矩陣或圖我就跳了……我恨英文

超時了

超時程式碼:

 1 #pragma warning (disable:4996)
 2 #include <iostream>
 3 #include<algorithm>
 4 #include<stdio.h>
 5 #include<math.h>
 6
#include<string.h> 7 //#include<string> 8 #define MAX1 100005 /*1e5 + 5*/ 9 #define MAX2 1000000005 /*le9 + 5*/ 10 #define MAX3 200005 /*1e5 + 5*/ 11 #define MAX4 5005 /*5e3 + 5*/ 12 #define MAX5 10005 /*1e4 + 5*/ 13 #define T1 27 14 #define T2 27 15 #define T3 18 16
using namespace std; 17 typedef long long int ll; 18 #define MOL 998244353 19 int main() { 20 int i, j, k; 21 int n, Q; 22 int mark[MAX1] = { 0 }; 23 int sum[MAX1] = { 0 }; 24 int a, b, c, ans; 25 while (scanf("%d", &n) != EOF) { 26 for (i = 1; i <= n; ++i) { 27 scanf("
%d", &mark[i]); 28 sum[i] = mark[i] + sum[i - 1]; 29 } 30 scanf("%d", &Q); 31 for (i = 0; i < Q; ++i) { 32 scanf("%d %d %d", &a, &b, &c); 33 if(a){ 34 ans = sum[c] - sum[b - 1]; 35 if (ans % (c - b + 1))ans = ans / (c - b + 1) + 1; 36 else ans = ans / (c - b + 1); 37 printf("%d\n", ans); 38 } 39 else { 40 mark[b] += c; 41 for (j = b; j <= n; ++j) { 42 sum[j] = sum[j - 1] + mark[j]; 43 } 44 } 45 } 46 } 47 return 0; 48 }
TimeLimit

對a=0操作迴圈

 1 #pragma warning (disable:4996)
 2 #include <iostream>
 3 #include<algorithm>
 4 #include<stdio.h>
 5 #include<math.h>
 6 #include<string.h>
 7 //#include<string>
 8 #define MAX1 100005            /*1e5 + 5*/
 9 #define MAX2 1000000005        /*le9 + 5*/
10 #define MAX3 200005            /*1e5 + 5*/
11 #define MAX4 5005            /*5e3 + 5*/
12 #define MAX5 10005            /*1e4 + 5*/
13 #define T1 27
14 #define T2 27
15 #define T3 18
16 using namespace std;
17 typedef long long int ll;
18 #define MOL 998244353
19 int main() {
20     int i, j, k;
21     int n, Q;
22     int mark[MAX1] = { 0 };
23     int a, b, c, ans;
24     while (scanf("%d", &n) != EOF) {
25         for (i = 1; i <= n; ++i) {
26             scanf("%d", &mark[i]);
27         }
28         scanf("%d", &Q);
29         for (i = 0; i < Q; ++i) {
30             scanf("%d %d %d", &a, &b, &c);
31             if(a){
32                 ans = 0;
33                 for (j = b; j <= c; ++j)
34                     ans += mark[j];
35                 int num = c - b + 1;
36                 if (ans % num)ans = ans / num + 1;
37                 else ans /= num;
38                 printf("%d\n", ans);
39             }
40             else {
41                 mark[b] += c;
42             }
43         }
44     }
45     return 0;
46 }
TimeLimit

對a=1操作迴圈

//----------------------修正中

改進方案:單獨把a=0操作的資料儲存於add陣列,做a=1操作時在sum陣列求區間和的基礎上加上add陣列區域和,以減少所需要的迴圈。

AC程式碼:

 1 #pragma warning (disable:4996)
 2 #include <iostream>
 3 #include<algorithm>
 4 #include<stdio.h>
 5 #include<math.h>
 6 #include<string.h>
 7 //#include<string>
 8 #define MAX1 100005            /*1e5 + 5*/
 9 #define MAX2 1000000005        /*le9 + 5*/
10 #define MAX3 200005            /*1e5 + 5*/
11 #define MAX4 5005            /*5e3 + 5*/
12 #define MAX5 10005            /*1e4 + 5*/
13 #define MAX6 1000005        /*1e6 + 5*/
14 #define T1 27
15 #define T2 27
16 #define T3 18
17 using namespace std;
18 typedef long long int ll;
19 #define MOL 998244353
20 int mark[MAX1] = { 0 };
21 int sum[MAX1] = { 0 };
22 int add[MAX1] = { 0 };
23 int main() {
24     int i, j, k;
25     int n, Q;
26     int a, b, c, ans;
27     int low, high;
28     while (scanf("%d", &n) != EOF) {
29         for (i = 1; i <= n; ++i) {
30             scanf("%d", &mark[i]);
31             sum[i] = sum[i - 1] + mark[i];
32         }
33         scanf("%d", &Q);
34         low = n;
35         high = 1;
36         for (i = 0; i < Q; ++i) {
37             scanf("%d %d %d", &a, &b, &c);
38             if(a){
39                 int addsum = 0;
40                 int beg = low<b?b:low;
41                 int end = high>c?c:high;
42                 for(j=beg;j<=end;++j){
43                     addsum += add[j];
44                 }
45                 int bcsum = sum[c] - sum[b - 1] + addsum;
46                 int num = c - b + 1;
47                 if (bcsum % num)
48                     ans = bcsum / num + 1;
49                 else
50                     ans = bcsum / num;
51                 printf("%d\n", ans);
52             }
53             else {
54                 add[b] += c;
55                 if (low > b)low = b;
56                 if (high < b)high = b;
57             }
58         }
59     }
60     return 0;
61 }