hdu 1422 重温世界杯

来源:互联网 发布:淘宝卖家申请小二介入 编辑:程序博客网 时间:2024/06/11 00:23

重温世界杯

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4370    Accepted Submission(s): 1492


Problem Description
世界杯结束了,意大利人连本带利的收回了法国人6年前欠他们的债,捧起了大力神杯,成就了4星意大利.
世界杯虽然结束了,但是这界世界杯给我们还是留下许多值得回忆的东西.比如我们听到了黄名嘴的3分钟激情解说,我们懂得了原来可以向同一个人出示3张黄牌,我们还看到了齐达内的头不仅能顶球还能顶人…………
介于有这么多的精彩,xhd决定重温德国世界杯,当然只是去各个承办世界杯比赛的城市走走看看.但是这需要一大比钱,幸运的是xhd对世界杯的热爱之情打动了德国世界杯组委会,他们将提供xhd在中国杭州和德国任意世界杯承办城市的往返机票,并说服了这些城市在xhd到达这座城市时为他提供一笔生活费以便他在那里参观时用,当参观完时剩余的钱也将留给xhd,但当生活费不够时他们将强行结束xhd的这次德国之行,除了这个,他们还有一个条件,xhd只能根据他们所给的路线参观.比如有3座城市a,b,c,他们给定了a-b-c-a的路线,那么xhd只有3种参观顺序abc,bca,cab.由于各个城市所提供的生活费和在那里的花费都不同,这使xhd很头痛,还好我们事先知道了这笔生活费和花费.请问xhd最多能顺利参观几座城市?
 

Input
每组输入数据分两行,第一行是一个正整数n(1<=n<=100000),表示有n座城市.接下来的一行按照给定的路线顺序的输出这n个城市的生活费和花费,w1,l1,w2,l2,……,wn,ln,其中wi,li分别表示第i个城市的生活费和花费,并且它们都是正整数.
 

Output
对应每组数据输出最多能参观的城市数.
 

Sample Input
33 2 3 4 2 233 2 3 4 2 3
 

Sample Output
32
 

Author
xhd
 

Source
ACM暑期集训队练习赛(二)
 
【题意】中文题,就不说了。。
【思路】
1.先算出去一个城市当前生活费的变化量,即W-L,由于是个环,所以要将环拆分为链并扩展一倍。
2.很容易看出这就是求   连续序列和,先求出前i项的和,然后求最长的连续不为0的序列。
注意:可能某个序列{Ai,Ai+1,Ai+2,...Aj}的总和>=0,但是肯能会有  { Ai,Ai+1,Ai+2,...Ai+k,} k<j的和<0,这样就造成了无法完成整个计划。但既然 r  能够达到  j   即说明前面必然存在一个 k<i  使sum(k,j)>=0,最优解必然不是当前处理的序列了(不影响最终结果),我们只需要找出第一个 Ai>=0 就能保证结果的正确性。
ps:证明得不是很严谨
【代码】
#include<cstdio>#include<cstring>#include<iostream>using namespace std;int  dp[100005*2];int sum[100005*2];int num[100005*2];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        for(int i=1;i<=n;i++)        {            int w,c;            scanf("%d%d",&w,&c);            num[i+n]=num[i]=w-c;        }        sum[0]=0;        for(int i=1;i<=2*n;i++)            sum[i]=sum[i-1]+num[i];        int ans=0;        int l=0,r;        for(r=1;r<=2*n;r++)        {            if(r-l>n)//长度不能超过 n                l++;            while(sum[r]-sum[l]<0)                l++;            ans=max(ans,r-l);        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击