刷题训练 hdu 1003

按时间顺序的做题代码如下:

 

Timelimit代码:(n^2 记录前缀和,遍历所有组合,即s[i]-s[j])

 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 1005            /*1e3 + 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 struct ans {
20     int max;
21     int beg;
22     int end;
23 };
24 int main() {
25     int a[MAX1] = { 0 };
26     int s[MAX1] = { 0 };
27     ans x, m_ans;
28     int t, n;
29     int i, j, k;
30     while (scanf("%d", &t) != EOF) {
31         for (k = 1; k <= t; ++k) {
32             scanf("%d", &n);
33             for (i = 1; i <= n; ++i) {
34                 scanf("%d", &a[i]);
35                 s[i] = s[i - 1] + a[i];
36             }
37             m_ans.max = -MAX1 * 1000;
38             for (i = 1; i <= n; ++i) {
39                 for (j = 0; j < i; ++j) {
40                     x.max = s[i] - s[j];
41                     x.beg = j + 1;
42                     x.end = i;
43                     if (m_ans.max < x.max)
44                         m_ans = x;
45                 }
46             }
47             printf("Case %d:\n%d %d %d\n", k, m_ans.max, m_ans.beg, m_ans.end);
48             if (k != t)printf("\n");
49         }
50     }
51 }
TimeLimit

 Wrong代码:(n 输入时用s存储前缀和,minx存储当前最小前缀和,minp存储minx对应位点,遍历)

错误点:没考虑max负数情况

 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 1005            /*1e3 + 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 
20 int a[MAX1] = { 0 };
21 int s[MAX1] = { 0 };
22 int mins[MAX1] = { 0 };
23 int minp[MAX1] = { 0 };
24 
25 int main() {
26     memset(a, 0, sizeof(a));
27     memset(s, 0, sizeof(s));
28     memset(mins, 100000000, sizeof(mins));
29     memset(minp, 0, sizeof(minp));
30     int t, n;
31     int i, j, k;
32     int m, beg, end;
33     while (scanf("%d", &t) != EOF) {
34         for (k = 1; k <= t; ++k) {
35             scanf("%d", &n);
36             for (i = 1; i <= n; ++i) {
37                 scanf("%d", &a[i]);
38                 s[i] = s[i - 1] + a[i];
39                 //mins[i] = min(mins[i - 1], s[i]);
40                 if (mins[i - 1] <= s[i]) {
41                     mins[i] = mins[i - 1];
42                     minp[i] = minp[i - 1];
43                 }
44                 else {
45                     mins[i] = s[i];
46                     minp[i] = i;
47                 }
48             }
49             m = -100000000;
50             for (i = 1; i <= n; ++i) {
51                 if (m < s[i] - mins[i]) {
52                     m = s[i] - mins[i];
53                     beg = minp[i] + 1;
54                     end = i;
55                 }
56             }
57             printf("Case %d:\n%d %d %d\n", k, m, beg, end);
58             if (k != t)printf("\n");
59         }
60     }
61 }
Wrong

 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 1005            /*1e3 + 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 
20 int a[MAX1] = { 0 };
21 int s[MAX1] = { 0 };
22 int mins[MAX1] = { 0 };
23 int minp[MAX1] = { 0 };
24 
25 int main() {
26     memset(a, 0, sizeof(a));
27     memset(s, 0, sizeof(s));
28     memset(mins, 100000000, sizeof(mins));
29     memset(minp, 0, sizeof(minp));
30     int t, n;
31     int i, j, k;
32     int m, beg, end;
33     while (scanf("%d", &t) != EOF) {
34         for (k = 1; k <= t; ++k) {
35             scanf("%d", &n);
36             for (i = 1; i <= n; ++i) {
37                 scanf("%d", &a[i]);
38                 s[i] = s[i - 1] + a[i];
39                 //mins[i] = min(mins[i - 1], s[i]);
40                 if (mins[i - 1] <= s[i]) {
41                     mins[i] = mins[i - 1];
42                     minp[i] = minp[i - 1];
43                 }
44                 else {
45                     mins[i] = s[i];
46                     minp[i] = i;
47                 }
48             }
49             m = -100000000;
50             for (i = 1; i <= n; ++i) {
51                 if (m < s[i] - mins[i]) {
52                     if (s[i] != mins[i]) {
53                         m = s[i] - mins[i];
54                         beg = minp[i] + 1;
55                         end = i;
56                     }
57                     else if (m < a[i]) {
58                         m = a[i];
59                         beg = i;
60                         end = i;
61                     }
62                 }
63             }
64             printf("Case %d:\n%d %d %d\n", k, m, beg, end);
65             if (k != t)printf("\n");
66         }
67     }
68 }

 

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