vijos 1907 飞扬的小鸟

我心里毫无波动甚至还有点想笑。

WTF

WTF

WTF

WTF

WTF

WTF

WTF

GTMD调了一天什么鬼啊。

原来更新的范围有讲究啊。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 1000000007
using namespace std;
int n,m,k,x[10050],y[10050],dp1[10050][1050],dp2[10050][1050],ret=0,ans1=0,mx[10050],ans2=inf;
struct pnt
{
    int p,l,h;
}p[10050];
bool vis[10050][1050];
bool cmp(pnt x,pnt y)
{
    return x.p<y.p;
}
bool fail_all(int x)
{
    for (int j=1;j<=m;j++)
        if (dp2[x][j]!=inf) return false;
    return true;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);
    for (int i=1;i<=n;i++) scanf("%d%d",&x[i-1],&y[i-1]);
    for (int i=1;i<=k;i++)
        scanf("%d%d%d",&p[i].p,&p[i].l,&p[i].h);
    sort(p+1,p+k+1,cmp);
    for (int i=1;i<=m;i++) vis[0][i]=true;
    for (int i=1;i<=n;i++)
    {
        while ((p[ret+1].p<=i) && (ret<=k-1)) ret++;
        int l,r;
        if (p[ret].p==i) {l=p[ret].l+1;r=p[ret].h-1;}
        else l=0,r=m;
        int limit=1;if (p[ret].p==i-1) limit=p[ret].l+1;
        for (int j=1;j<=m;j++) dp2[i][j]=inf;
        for (int j=1;j<=m-1;j++)
        {
            if (((vis[i][j-x[i-1]]) || (vis[i-1][j-x[i-1]])) && (j>x[i-1]))
            {
                dp1[i][j]=max(dp1[i-1][j-x[i-1]],dp1[i][j-x[i-1]]);
                dp2[i][j]=min(dp2[i][j],dp2[i][j-x[i-1]]+1);
                dp2[i][j]=min(dp2[i][j],dp2[i-1][j-x[i-1]]+1);
                vis[i][j]=true;
            }
        }
        for (int j=1;j<=m-1;j++)
        {
            if ((j+y[i-1]<=m) && (vis[i-1][j+y[i-1]]))
            {
                dp1[i][j]=max(dp1[i][j],dp1[i-1][j+y[i-1]]);
                dp2[i][j]=min(dp2[i][j],dp2[i-1][j+y[i-1]]);
                vis[i][j]=true;
            }
        }
        for (int j=1;j<=m;j++)
        {
            if (vis[i-1][j])
            {
                int ret;
                dp1[i][m]=max(dp1[i][m],dp1[i-1][j]);
                if ((m-j)%x[i-1]) ret=(m-j)/x[i-1]+1;
                else if (m==j) ret=1;
                else ret=(m-j)/x[i-1];
                dp2[i][m]=min(dp2[i][m],dp2[i-1][j]+ret);
                vis[i][m]=true;
            }
        }
        for (int j=0;j<=l-1;j++) {vis[i][j]=false;dp2[i][j]=inf;}
        for (int j=r+1;j<=m;j++) {vis[i][j]=false;dp2[i][j]=inf;}
        for (int j=1;j<=m;j++)
            if (vis[i][j])
                {
                    dp1[i][j]+=(p[ret].p==i);
                    ans1=max(ans1,dp1[i][j]);
                }
        if (vis[i][m]) ans1=max(ans1,dp1[i][m]);
        if (fail_all(i))
        {
            printf("0\n%d\n",ans1);
            return 0;
        }
    }
    for (int i=0;i<=m;i++)
        if (vis[n][i]) ans2=min(ans2,dp2[n][i]);
    printf("1\n%d\n",ans2);
    return 0;
}
时间: 2024-12-10 18:10:51

vijos 1907 飞扬的小鸟的相关文章

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 (

洛谷 【P1941】飞扬的小鸟

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

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

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

codevs 3729 飞扬的小鸟 x

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

洛谷P1941 飞扬的小鸟 动态规划

洛谷P1941 飞扬的小鸟 动态规划 这道题主要要注意一下飞到m以上之后高度还是 m 这个就要在判断一下 比较直接暴力的动归 是 O(N^3) f[ i ][ j ] 到 i ,j 这个位置 所需要的最少点击次数 如果不能到,就是无限大 f[ i ][ j ] = min(f[ i-1 ][ j-up[i-1] ] +1 , f[ i-1 ][ j+down[i-1] ] ) 因为可以向上飞无限次 这其实就相当于是无限背包 然后 f[ i ][ j ] 就可以从 f[ i ][ j-up[ i-

noip2014飞扬的小鸟

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

[NOIP2014] 飞扬的小鸟

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

【NOIP2014】飞扬的小鸟

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

[codevs3729]飞扬的小鸟

试题描述 输入 输出 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果第一行为 1,则输出成功完成游戏需要最少点击屏幕数, 否则,输出小鸟最多可以通过多少个管道缝隙. 输入输出示例 数据规模及约定 对于 30%的数据:5≤n≤10,5≤m≤10,k=0,保证存在一组最优解使得同一单位时间最多点击屏幕 3 次: 对于 50%的数据:5≤n≤20,5≤m≤10,保证存在一组最优解使得同一单位时间最多点击屏幕