HDU 1422 重温世界杯(DP)

点我看题目

题意 : 中文题不详述。

思路 : 根据题目描述及样例可以看出来,如果你第一个城市选的是生活费花费大于等于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\n") ;

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\n",cnt) ;

50     }

51     return 0 ;

52 }
View Code

 

你可能感兴趣的:(HDU)