重温世界杯
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;
}