zoukankan      html  css  js  c++  java
  • HDU 1244 【DP】

    题意:

    中文。

    思路:

    先初步处理,用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
    ",maxn);
        }
    }
  • 相关阅读:
    Thread与Handler
    开始机顶盒的生涯
    解决布局被键盘顶的难题
    自动滚动的Textview
    2-解决粘包问题
    1-socket编程
    zipfile模块
    subprocess模块
    day31-异常处理
    collections模块
  • 原文地址:https://www.cnblogs.com/tun117/p/4899014.html
Copyright © 2011-2022 走看看