飞扬的小鸟(NOIP2014)(丧病DP题)

原题传送门

刚开始我还以为这道题目非常的简单。。

然后随便打了一个DP,直接WA,被zxyer狠狠地D了一顿。

然后发现有好多细节。。

首先假如某横坐标没有管子,那么l[x]=0;h[x]=m+1;

然后DP的时候往上是完全背包,往下是01背包。

由于不能接触到管子,所以0~l[x]和h[x]~m要设值inf方便下面判断。

m-max(q)*x[i]~m也要特判,因为有限高。。

最后统计答案也是很醉、。、

下面贴代码。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define inf ((1<<31)-2)
using namespace std;
int f[10001][1001];
int n,m,k,ans;
int x[10001],y[10001];
int l[10001],h[10001];
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<n;i++)
    scanf("%d%d",&x[i],&y[i]);
    for(int i=1;i<=n;i++)
    l[i]=0,h[i]=m+1;
    for(int i=1;i<=k;i++)
    {
    int p1,l1,h1;
    scanf("%d%d%d",&p1,&l1,&h1);
    l[p1]=l1;h[p1]=h1;
    }
    for(int i=1;i<=n;i++)
    for(int j=0;j<=m;j++)f[i][j]=inf;
    f[0][0]=inf;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(j>=x[i-1])
            {
                f[i][j]=min(f[i][j],f[i-1][j-x[i-1]]+1);
                f[i][j]=min(f[i][j],f[i][j-x[i-1]]+1);
            }
            if(j==m)
            {
                for(int k=j-x[i-1];k<=m;k++)
                {
                    f[i][j]=min(f[i][j],f[i-1][k]+1);
                    f[i][j]=min(f[i][j],f[i][k]+1);
                }
            }
        }
        for(int j=l[i]+1;j<h[i];j++)
        if(j+y[i-1]<=m)
        f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]);
        for(int j=1;j<=l[i];j++)
        f[i][j]=inf;
        for(int j=h[i];j<=m;j++)
        f[i][j]=inf;
    }
    int cnt=k,ans=inf;
    for(int i=n;i>=1;i--)
    {
        for(int j=l[i]+1;j<h[i];j++)
        if(f[i][j]<inf) ans=min(ans,f[i][j]);
        if(ans!=inf)break;
        if(h[i]<=m)cnt--;
    }
    if(cnt==k)
        printf("1\n%d\n",ans);
    else
        printf("0\n%d\n",cnt);
    return 0;
} 
时间: 2024-10-12 01:03:40

飞扬的小鸟(NOIP2014)(丧病DP题)的相关文章

noip2014飞扬的小鸟

飞扬的小鸟 题目链接 题意: 一个二维平面,长为\(n\),宽为\(m\),其中有\(k\)个管道,小鸟从最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成. 小鸟每个单位时间沿着\(x\)轴向右移动一个单位距离,小鸟在从\(i\)移动到\(i +1\)时,玩家可以选择是否点击屏幕(可以点击多次),若不点击,小鸟将下降\(y_i\)单位距离,若点击\(j\)次,小鸟的上升距离为\(j\times x_i\). 当小鸟碰到管壁或纵坐标等于\(0\)时,游戏结束.小鸟的高度可以不停上升,但最

[ NOIP ][ NOIP_2014D1T3 ][ 动态规划 ] 飞扬的小鸟

飞扬的小鸟(Flappy Bird) 描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败. 为了简化问题,我们对游戏规则进行了简化和改编: 游戏界面是一个长为 n,高为 m 的二维平面,其中有k 个管道(忽略管道的宽度). 小鸟始终在游戏界面内移动.小鸟从游戏界面最左边 任意整数高度位置出发,到达游戏界面最右边时,游戏完成. 小鸟每个单位时间沿

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 (

[NOIP 2014TG D1T3] 飞扬的小鸟

题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败. 为了简化问题,我们对游戏规则进行了简化和改编: 游戏界面是一个长为n ,高为 m 的二维平面,其中有k 个管道(忽略管道的宽度). 小鸟始终在游戏界面内移动.小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成. 小鸟每个单位时间沿横坐标方向右移的距离为1 ,竖直移动

codevs 3729 飞扬的小鸟 x

3729 飞扬的小鸟 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 输入描述 Input Description 输出描述 Output Description 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果第一行为 1,则输出成功完成游戏需要最少点击屏幕数, 否则,输出小鸟最多可以通过多少个管道缝隙. 样例输入 Sample In

ACM/ICPC算法训练 之 数学很重要-浅谈“排列计数” (DP题-POJ1037)

这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列计数 的方法,虽然排列计数的思路简单,但却是算法中一个数学优化的点睛之笔. Poj1037  A decorative fence 题意:有K组数据(1~100),每组数据给出总木棒数N(1~20)和一个排列数C(64位整型范围内),N个木棒长度各异,按照以下条件排列,并将所有可能结果进行字典序排序 1.每一

2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题

听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到100即可 算最大GPA的时候,首先每个科目分配到60分,然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到85即可,如果还有REMAIN POINT,就FOR循环下来加到100上限即可 不会DP 阿 QAQ 过段时间得好好看DP了  =  = 于是默默的把这题标记为<水题集> //

洛谷 【P1941】飞扬的小鸟

P1941 飞扬的小鸟 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败. 为了简化问题,我们对游戏规则进行了简化和改编: 游戏界面是一个长为n ,高为 m 的二维平面,其中有k 个管道(忽略管道的宽度). 小鸟始终在游戏界面内移动.小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成. 小鸟每个单位时间沿横坐标方向右

几个相似的DP题

HDU1398 题意:把一个整数分拆成1.4.9.16.--.256.289(注意:只到289)这17个完全平方数的和,有几种方法. 解法不用说自然是DP,因为搜索显然超时. (这样的题我一般不敢开int,怕爆--) 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <functional> 6 7 us