刷題訓練 hdu 1003
阿新 • • 發佈:2020-07-27
按時間順序的做題程式碼如下:
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*/ 9TimeLimit#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 intmax; 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 }
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 }