luogu 1941 飞扬的小鸟
这道题对于第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 飞扬的小鸟的更多相关文章
- luogu P1941 飞扬的小鸟
题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便 ...
- Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)
Luogu 1941 [NOIP2014]飞扬的小鸟 (动态规划) Description Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度 ...
- [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解
2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...
- P1907飞扬的小鸟
P1907飞扬的小鸟 描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或 ...
- [codevs3729]飞扬的小鸟
[codevs3729]飞扬的小鸟 试题描述 输入 输出 输出文件名为 bird.out. 共两行. 第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0. 第二行,包含一个整数,如果 ...
- Codevs 3729==洛谷P1941 飞扬的小鸟
P1941 飞扬的小鸟 456通过 2.4K提交 题目提供者该用户不存在 标签动态规划2014NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 Flappy Bird 是一 ...
- NOIP2014 飞扬的小鸟
3. 飞扬的小鸟 (bird.cpp/c/pas) [问题描述] Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的 ...
- Codevs 3729 飞扬的小鸟
飞扬的小鸟 标签 动态规划 NOIp提高组 2014 难度 提高+/省选- 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小 ...
- [NOIP2014][DP]飞扬的小鸟
[NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...
随机推荐
- VIM7.4 编译安装 开启python
https://github.com/wklken/k-vim ./configure --prefix=/usr/local/vim74 \--with-features=huge \--enabl ...
- excel如何将一列按奇偶数分成两列
借助于函数.上图说明一切: 方法一.OFFSET函数, 奇数列公式:C1=OFFSET($A$1,ROW()*2-2,), 偶数列公式:D1=OFFSET($A$1,ROW()*2-1,) 一起下拉即 ...
- asp.net 后台给前台控件添加及设置属性
txtTopImgBox.Attributes.Add("title", "12312121"); Text1.Style["background-c ...
- H5自带进度条&滑块
一.H5自带进度条 <div id="d1"> <p id="pgv">进度:0%</p> <progress id= ...
- 前端学习笔记-CSS
- CentOS 7.1 下载,安装,配置
CentOS(全称 Community Enterprise Operating System)是 RHEL 源代码再编译的产物. 2014年初,CentOS 宣布加入 Red Hat. CentOS ...
- 【摘录】JAVA内存管理-自动选择垃圾收集器算法
在J2SE 5.0,垃圾收集的默认值:垃圾收集器.堆大小以及JVM的类型(客户端还是服务器)都会根据应用运行的硬件平台和操作系统自动选择.相比之前设置命令行参数的方式,自动选择很好的匹配了不同类型的应 ...
- 【前端分享】 JavaScript最经典的55个技巧(转)
从别的地方看到的,保存下,有空实践下再补充. 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <tab ...
- day19-2 生成器,递归函数
目录 生成器 有关yield的理解 实现range()函数 生成器表达式 递归 思考 斐波那契额 汉诺塔 二分法 生成器 自定义的迭代器 yield关键字: 和return一样,接收值,但不终止函数 ...
- UVALive-7197 Axles 动态规划 多个背包问题
题目链接:https://cn.vjudge.net/problem/UVALive-7197 题意 需要生产n种(2<=n<=14)零件,每种零件可以用两种材料制作,对这两种材料的消耗相 ...