訓練賽後補題 10
阿新 • • 發佈:2020-07-22
摘要: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> 6TimeLimit#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 16using 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 }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 }