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

 

posted @ 2020-07-22 17:15  听说福建人很好吃  阅读(103)  评论(0)    收藏  举报