做法:把给的 费用减去花费。得到的值就是一个城市所获得的 或花去的钱。 然后从第一座城市开始,poi都加上这个值,poi为负时初始化,为正时跟新ans为最大值。和最大子串和基本一样,不过因为可以是环,所以 结尾城市遍历完 还要再到开头。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include <math.h> #include <string> #include <iostream> #include <algorithm> using namespace std; #include <stack> #include <queue> #include <vector> #include <deque> #include <set> #include <map> using namespace std; int arr[100100]; int main(){ int n,a,b; while(scanf("%d",&n)!=EOF) { for(int ii=0;ii<n;ii++) { scanf("%d%d",&a,&b); arr[ii]=a-b; } int i=0; int poi=0; int pos=-1; int ans=0; int num=0; int flag=0; while(1) { if(i==pos) break; poi+=arr[i]; if(poi>=0) { num++; if(pos==-1) pos=i; ans=max(ans,num); } else { pos=-1; num=0; poi=0; } i++; if(i==n&&flag==1) break; if(i==n&&flag==0) { i=0; flag=1; } } printf("%d\n",ans); } return 0; }