zoukankan      html  css  js  c++  java
  • luogu P1941 飞扬的小鸟

    二次联通门 : luogu P1941 飞扬的小鸟

    /*
        luogu P1941 飞扬的小鸟
    
        dp
        向上飞是完全背包,向下掉就是01背包
        分情况讨论一下
        最后合并一下
    */
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    
    const int BUF = 123123123;
    char Buf[BUF], *buf = Buf;
    
    inline void read (int &now)
    {
        for (now = 0; !isdigit (*buf); ++ buf);
        for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf);
    }
    #define Max 10010
    
    int x[Max], y[Max], dp[Max][Max / 10];
    int up[Max], down[Max];
    
    inline int min (int a, int b)
    {
        return a < b ? a : b;
    }
    
    int Main ()
    {
        freopen ("bird.in", "r", stdin);
        freopen ("bird.ans", "w", stdout);
        fread (buf, 1, BUF, stdin);    
        register int i, j, k; int N, M, K; read (N), read (M), read (K);
        int z; memset (dp, 0x3f, sizeof dp); int Count, Answer;
        for (i = 1; i <= M; ++ i) dp[0][i] = 0;
        for (i = 1; i <= N; ++ i) up[i] = M + 1;
        for (i = 0; i < N; ++ i)
            read (x[i]), read (y[i]);
        for (i = 1; i <= K; ++ i)
            read (z), read (down[z]), read (up[z]);
        long long INF = dp[0][0];
        for (i = 1; i <= N; ++ i)
        {
            for (j = 1; j <= M; ++ j)
            {
                if (j > x[i - 1])
                {
                    dp[i][j] = min (dp[i][j], dp[i - 1][j - x[i - 1]] + 1);
                    dp[i][j] = min (dp[i][j], dp[i][j - x[i - 1]] + 1);
                }
                if (j == M)
                    for (k = j - (i - 1)[x]; k <= M; ++ k)
                    {
                        dp[i][j] = min (dp[i][j], dp[i - 1][k] + 1);
                        dp[i][j] = min (dp[i][j], dp[i][k] + 1);
                    }
            }
            for (j = down[i] + 1; j <= up[i] - 1; ++ j)
                if (j + (i - 1)[y] <= M)
                    dp[i][j] = min (dp[i][j], dp[i - 1][j + (i - 1)[y]]);
            for (j = 1; j <= down[i]; ++ j) dp[i][j] = INF;
            for (j = up[i]; j <= M; ++ j) dp[i][j] = INF;
        }
        Count = K, Answer = INF;
        for (i = N; i >= 1; -- i)
        {
            for (j = down[i] + 1; j <= up[i] - 1; ++ j)
                if (dp[i][j] < INF) Answer = min (Answer, dp[i][j]);
            if (Answer != INF) break;
                if (up[i] <= M) -- Count;
        }
        if (Count == K) printf ("1
    %d
    ", Answer);
        else printf ("0
    %d
    ", Count);
        return 0;
    }
    
    int ZlycerQan = Main ();
    int main (int argc, char *argv[]) {;}
  • 相关阅读:
    HAproxy 1.5 dev14 发布
    IBM/DW 使用 Java 测试网络连通性的几种方法
    Skype 4.1 Linux 发布,支持微软帐号登录
    Dorado 7.1.20 发布,Ajax的Web开发平台
    Aspose.Slides for Java 3.0 发布
    开发版本 Wine 1.5.18 发布
    BitNami Rubystack 开始支持 Ruby 2.0
    XWiki 4.3 正式版发布
    Silverlight实例教程 Out of Browser的Debug和Notifications窗口
    Silverlight实例教程 Out of Browser与Office的互操作
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/7413830.html
Copyright © 2011-2022 走看看