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
") ;
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 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3645727.html