题意 : 中文题不详述。
思路 : 根据题目描述及样例可以看出来,如果你第一个城市选的是生活费减花费大于等于0的时候才可以,最好是多余的,这样接下来的就算是花超了(一定限度内的花超),也可以通过前边的剩余来补充进去,就可以多玩一个。所以先存一下每个城市的生活费减去花费的剩余,然后从非负开始找,找一个数组存一下现在还剩下的多余花费,还要在找一个数组存一下当前点用的天数,可以从头开始重新选择新的城市。
1 //HDU 1422 2 #include <stdio.h> 3 #include <string.h> 4 #include <iostream> 5 using namespace std; 6 7 int a[200010] ; 8 int c[200010] ; 9 int sum[200010] ; 10 int main() 11 { 12 int n; 13 while(~scanf("%d",&n)) 14 { 15 int w, l ; 16 for(int i = 0 ; i < n ; i++) 17 { 18 scanf("%d %d",&w,&l) ; 19 a[i] = a[n+i] = w-l ; 20 } 21 int i ; 22 for(i = 0 ; i < 2*n ; i++) 23 if(a[i] >= 0) 24 break ; 25 if(i == 2*n) 26 { 27 printf("0 ") ; 28 continue; 29 } 30 int cnt = 1 ; 31 sum[i] = a[i] ; 32 c[i] = 1 ; 33 i++ ; 34 for( ; i < 2*n ; i++) 35 { 36 if(cnt == n) break ; 37 if(sum[i-1] + a[i] >= 0) 38 { 39 c[i] = c[i-1]+1 ; 40 sum[i] = sum[i-1]+a[i] ; 41 cnt = max(cnt,c[i]) ; 42 } 43 else 44 { 45 sum[i] = 0 ; 46 c[i] = 0 ; 47 } 48 } 49 printf("%d ",cnt) ; 50 } 51 return 0 ; 52 }