1. 程式人生 > >hdu1003 (格式 + 貪心)

hdu1003 (格式 + 貪心)

問題傳送門

問題描述可以點選這裡,大體就是求最長連續和的最大值,並且給出下標。

這個是個貪心問題,只需要從左到右累加,只要是正數,就跟最大值比較,替換最大值,更改區間座標。

如果累加小於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

*/