1. 程式人生 > 實用技巧 >刷題訓練 hdu 1003

刷題訓練 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 }