hdu1003 (格式 + 貪心)
阿新 • • 發佈:2018-12-12
問題描述可以點選這裡,大體就是求最長連續和的最大值,並且給出下標。
這個是個貪心問題,只需要從左到右累加,只要是正數,就跟最大值比較,替換最大值,更改區間座標。
如果累加小於0,sum 置零,左右變數更改為下一個座標。最終輸出即可。
程式碼如下
#include <algorithm> #include <iostream> #include <cstring> #include <stdio.h> #include <string> #include <vector> #include <stack> #include <cmath> #include <deque> #include <queue> #include <map> using namespace std; typedef long long ll; const int MOD = 1e9+7; #define Foru(i,a,b) for(i = a;i < b;i ++) #define Ford(i,a,b) for(i = a;i > b; i --) #define MAXN 100001 int s[MAXN]; int main(){ int a,b,sum,T; scanf("%d",&T); for(int j = 1;j <= T; j ++){ int n; scanf("%d",&n); for(int i = 0;i < n;i ++){ scanf("%d",&s[i]); } int Max = -20000; int l,r,l1,r1; //l1,l2 為最終座標,l.r為臨時下標區間 int under = 0; sum = 0; l = 0,r = 0; for(int i = 0;i < n;i ++){ sum += s[i]; if(Max < sum){ Max = sum; r = i; l1 = l,r1 = r; } if(sum < 0){ sum = 0; l = i+1,r = i+1; } } printf("Case %d:\n%d %d %d\n",j,Max,l1+1,r1+1); if(j < T)puts(""); } return 0; } /* 2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5 */