用ans[i]存 生活费和话费之差
类似求最大区间和
注意路线是一个环。
#include <stdio.h>
#define MAX 100000
int ans[2*MAX+5];
int dp[2*MAX+5];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int x,y;
for(int i=1;i<=n;i++)
{
scanf("%d %d",&x,&y);
ans[i]=x-y;
}
for(int i=n+1;i<=2*n;i++) //因为路线是环,所以这里是2*n
ans[i]=ans[i-n];
dp[1]=ans[1];
for(int i=2;i<=2*n;i++)
dp[i]=dp[i-1]>=0?dp[i-1]+ans[i]:ans[i];
int k=0,t=0;
for(int i=1;i<=2*n;i++)<span style="white-space:pre"> </span> //求非负连续最大区间
{
if(dp[i]>=0)
t++;
else
t=0;
k=k>t?k:t;
}
if(k>n) //最多旅游n个城市
k=n;
printf("%d\n",k);
}
return 0;
}