训练赛后补题 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 }
对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 }
对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 }

浙公网安备 33010602011771号