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