杭电1422

来源:互联网 发布:部落冲突8本满科技数据 编辑:程序博客网 时间:2024/05/25 12:22

这是一比较简单的DP题,差不多是最大字段和吧。和前面的最大连续子序列有一点点像。但是这一题加深了一点难度。就是他并不一定是从最开始的开始计算。而是固定的距离就是说可以走的话,无论从什么地方走都要吧路线走完。所以这个就需要一点拐弯。题目:http://acm.hdu.edu.cn/showproblem.php?pid=1422中文的都知道什么意识我就不解释了。这时候我们想的就是他从一个地方开始走要想走下去的话,就需要他以前剩余的钱数(第一天的时候以前剩余的钱是0)加上今天的费用大于等于今天需要有的花费。这就自然而然的看到了解题的方向。有了大概的思路我们再来讲讲细处:

首先如果开始从j到某一天i走不了了那么我们应该记录这个最大的天数,之后再从i之后算起(之所以不从j+1计算那是因为我们知道j是有剩余的钱的(最少是0)那么就算从j+1算起到i还是会走不下去这样的话就少了一天)。直到下一个k走不动,i+1到k的时间,看看和之前的谁大谁小。

其次我们还要注意这个最大的天数是在for循环求的就是for(m=0;m<n;m++);那么假如说一直可以往后走不会断的话那么最大值Max就一直是0;

最后假如说我们从k走到N-1(最后)还没有走完,那么就需要从0在开始走,最多到k-1天。

有了上面这些这题就出来了,至于数据,下面提供一个AC代码大家可以自己设置数据检测:

#include<iostream>using namespace std;const int Max=100005;int a[Max],b[Max];//a是生活费int main(){    int N;    int i,j,m;    int p;    while(scanf("%d",&N)!=EOF)    {   m=-1;        j=0;        int max=0;        int num=0;        int sum=0;         for(i=0;i<N;i++)             scanf("%d%d",&a[i],&b[i]);         for(i=0;i<N;i++)         {             if(a[i]+sum-b[i]>=0)             {              sum=a[i]+sum-b[i];              num++;              if(i==N-1)              {
                   for(p=0;p<=m;p++)                    if(a[p]+sum>=b[p])                    {                        sum=a[p]+sum-b[p];                        num++;                    }                    else break;              }                 }             else              {                 m=i;                 sum=0;                 if(num>max)                 {                     max=num;                 }                 num=0;             }         }         if(num>max)             max=num;         cout<<max<<endl;    }    return 0;}

0 0