重温世界杯 HDU - 1422

重温世界杯

HDU - 1422
题意:xxx去环游世界, 按给出顺序参观城市, 每到一所城市会得到生活费并花掉一些, 剩下的钱可以攒着,一旦没钱了就会被遣送回国;
将生活费和花费合并(生活费-话费),不就成了求循环数组的最长的和>=0的子段和;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=100100;
int n, a[maxn*2], ans[maxn*2];
int main(){
	while(~scanf("%d", &n)){
		int x, y;
		for(int i=1; i<=n; i++){
			scanf("%d%d", &x, &y);
			a[i]=a[i+n]=x-y;
		}
		int sum=0, cnt=0, ans=0;
		for(int i=1; i<=2*n; i++){
			if(sum+a[i]>=0){
				cnt++;
				sum+=a[i];
				ans=max(cnt, ans);
				if(cnt==n) break;
			}
			else{
				sum=0, cnt=0;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/sirius_han/article/details/80393284