码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1244 【DP】

时间:2015-10-21 22:32:33      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

题意:

中文。

思路:

先初步处理,用give-take求出每个城市剩的钱。

求解问题转化成使得和不小于0的最长连续字串。

枚举起点,然后当该起点加的和为负时开始枚举下一起点。(这个状态的转移)

2WA原因:

因为扩展了2倍的点使得求解的最长连续的点有可能大于n。

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
int tmp[200015];
int main()
{
    int n,give,take;
    while(scanf("%d",&n)!=EOF)
    {
        int maxn=1;
        tmp[0]=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&give);
            scanf("%d",&take);
            tmp[i]=give-take;
        }
        for(int i=n+1;i<=2*n;i++)
        {
            tmp[i]=tmp[i-n];
        }
        int j=1;
        int num=0;
        for(int i=1;i<=n;i++)
        {
            num-=tmp[i-1];
            for(;j<=2*n;j++)
            {
                if(num<0)
                    break;
                num+=tmp[j];
                if(num>=0)
                    maxn=max(j-i+1,maxn);
            }
            if(maxn>=n)
                break;
        }
        maxn=min(n,maxn);
        printf("%d\n",maxn);
    }
}

 

HDU 1244 【DP】

标签:

原文地址:http://www.cnblogs.com/tun117/p/4899014.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!