这道题对于第13个数据点,不知为什么f数组第二位开到2000以下就不能过,求指教

飞扬的小鸟

传送门

题目大意

一个小鸟在\(n*m\)的方阵里,然后有许多管道你们玩过就不多介绍了,然后每一个位置,点击会上升,不点击可以下降,点击效果可以叠加。

求如果通关的最小点击次数,否则会最多通过多少个管道。

solution

30pts

就是搜索,本以为会拿50pts。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cstdio>
using namespace std;
int n,m,k,up[20000],down[20000],vis[20000],flag,maxn,minn=0x7fffffff;
struct edge {
int u,d;
} e[20000];
void dfs(int x,int h,int tot) {
if(h<=0) return ;
maxn=max(maxn,x);
if(x==n+1 && h>0) {
flag=true;
minn=min(minn,tot);
return;
}
if(vis[x+1]) {
for(int i=1; i<=3; i++) {
if(h+up[x]*i<e[x+1].u && h+up[x]*i>e[x+1].d )dfs(x+1,((h+up[x]*i<=m)?(h+up[x]*i):m),tot+i);
}
if(h-down[x]<e[x+1].u && h-down[x]>e[x+1].d ) dfs(x+1,h-down[x],tot);
}
else {
for(int i=1; i<=3; i++) {
dfs(x+1,((h+up[x]*i)<=m?(h+up[x]*i):m),tot+i);
}
dfs(x+1,h-down[x],tot);
}
}
int main() {
scanf("%d%d%d",&n,&m,&k);
for(int i=0; i<=n-1; i++)
scanf("%d%d",&up[i],&down[i]);
for(int i=1; i<=k; i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
vis[a]=1;
e[a].u=c;
e[a].d=b;
}
for(int i=0; i<=m; i++)
if(vis[i] && i>e[i].d && i<e[i].u)
dfs(0,i,0);
else dfs(0,i,0);
if(flag==true) {
printf("1\n%d",minn);
} else {
int ans=0;
for(int i=0; i<=maxn; i++)
if(vis[i])ans++;
printf("0\n%d",ans);
}
return 0;
}

100pts

动态规划

这道题如果细想,还真是可以用背包做,虽然限制条件多了一点。

如果小鸟向上飞,则是完全背包。

如果小鸟向下飞,则是01背包。

如果小鸟遇到柱子,那么将此状态取消

如果小鸟飞到m以上,那么定为m。

最后输出倒叙查询dp数组就可以了

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int f[10010][2010];
int n,m,k;
int x[10010],y[10010];
int vis[10010];
int low[10010],high[10010];
int main() {
scanf("%d%d%d",&n,&m,&k);
for(int i=1; i<=n; ++i) scanf("%d%d",&x[i],&y[i]);
for(int i=1; i<=n; ++i) low[i]=1,high[i]=m;
for(int i=1; i<=k; ++i) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
vis[a]=1;
low[a]=b+1;
high[a]=c-1;
}
memset(f,0x3f,sizeof(f));
for(int i=1; i<=m; ++i) f[0][i]=0;
for(int i=1; i<=n; ++i) {
for(int j=x[i]+1; j<=m+x[i]; ++j)
f[i][j]=min(f[i-1][j-x[i]]+1,f[i][j-x[i]]+1);//如果向上飞
for(int j=m+1; j<=m+x[i]; ++j)//将超过m的更新到m
f[i][m]=min(f[i][m],f[i][j]);
for(int j=1; j<=m-y[i]; ++j)//如果向下飞
f[i][j]=min(f[i][j],f[i-1][j+y[i]]);
for(int j=1; j<low[i]; ++j)//遇到柱子直接g
f[i][j]=f[0][0];
for(int j=high[i]+1; j<=m; ++j)
f[i][j]=f[0][0];
}
int ans=f[0][0];
for(int j=1; j<=m; ++j)
ans=min(ans,f[n][j]);
if(ans<f[0][0]) printf("1\n%d",ans);
else {
int i,j;
for(i=n; i>=1; i--) {
for(j=1; j<=m; ++j)
if(f[i][j]<f[0][0]) break;
if(j<=m) break;
}
ans=0;
for(int p=1; p<=i; ++p)
if(vis[p])ans++;
printf("0\n%d",ans);
}
return 0;
}

luogu 1941 飞扬的小鸟的更多相关文章

  1. luogu P1941 飞扬的小鸟

    题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便 ...

  2. Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)

    Luogu 1941 [NOIP2014]飞扬的小鸟 (动态规划) Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度 ...

  3. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

    2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...

  4. P1907飞扬的小鸟

    P1907飞扬的小鸟 描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或 ...

  5. [codevs3729]飞扬的小鸟

    [codevs3729]飞扬的小鸟 试题描述 输入 输出 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果 ...

  6. Codevs 3729==洛谷P1941 飞扬的小鸟

    P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 Flappy Bird 是一 ...

  7. NOIP2014 飞扬的小鸟

    3. 飞扬的小鸟 (bird.cpp/c/pas) [问题描述] Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的 ...

  8. Codevs 3729 飞扬的小鸟

    飞扬的小鸟 标签 动态规划 NOIp提高组 2014 难度 提高+/省选- 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...

  9. [NOIP2014][DP]飞扬的小鸟

    [NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...

随机推荐

  1. 杂项-Java:Spring Cloud

    ylbtech-杂项-Java:Spring Cloud Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册. ...

  2. 软件测试中的fault,error,failure

    问题:给定两段代码,设计fault,error,failure的测试用例. fault:即引起错误的原因,类似病因. error:类似疾病引起的内部结果. failure:类似疾病引起的症状. 代码1 ...

  3. canvas绘制饼型图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Linux内核分析笔记

    我在MOOC<Linux内核分析>的学习笔记,这里只做个索引! 计算机是如何工作的

  5. POJ 1995 Raising Modulo Numbers 【快速幂取模】

    题目链接:http://poj.org/problem?id=1995 解题思路:用整数快速幂算法算出每一个 Ai^Bi,然后依次相加取模即可. #include<stdio.h> lon ...

  6. 边框的使用,border-radius,box-shadow,border-image

    <html>    <head>        <meta charset="UTF-8">        <title></ ...

  7. Eclipse配置SVN的几种方法及使用详情(此文章对Myeclipse同样适用)

    一.在Eclipse里下载Subclipse插件 方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help --> Eclipse Mark ...

  8. 关于read函数的一些分析

    ssize_t readn(int fd, std::string &inBuffer, bool &zero) { ssize_t nread = ; ssize_t readSum ...

  9. P3387 【模板】缩点 && P3388 【模板】割点(割顶)

    Tarjan算法 应用: 有向图的强连通分量 无向图割点和桥 双连通分量 接下来主要谈论前面两者的应用(主要是第三种还没学会) 算法简要介绍 我们需要先理解一下知识:搜索树 有向图的搜索树的4种边,如 ...

  10. IOS - ImagePicker 连拍

    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)sel ...