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 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...
随机推荐
- iis 部署
配置错误1: 由于权限不足而无法读取配置文件 建立一个新用户,分配所有权限 http://blog.csdn.net/jaychouliyu/article/details/7237143 配置错误2 ...
- Redis学习笔记(六) 基本命令:List操作
原文链接:http://doc.redisfans.com/list/index.html lpush key value[value...] 将一个或多个value插入到列表的表头:例:lpush ...
- android编译ffmpeg+x264
下载最新版的x264ftp://ftp.videolan.org/pub/videolan/x264/snapshots/1.解压到指定的目录2.切换当前目录为该目录3.创建一个shell脚本buil ...
- adplus 抓取dump
工具所在路径 C:\Program Files\Windows Kits\10\Debuggers\x64 cmd窗口切换目录倒adplus所在路径下,输入抓取命令.adplus -hang -p ...
- Chrome 开发工具系列
- windows下git server搭建
使用gitblit1.8搭建 首先要安装JDK 然后下载gitblit,这里给一个CSDN下载 https://download.csdn.net/download/nietzsche0/104826 ...
- Run-time type information--RTTI
In computer programming, run-time type information or run-time type identification (RTTI)[1] refers ...
- day05-3 初步了解数据类型
目录 数据类型介绍 数字类型 整形(int) 浮点型(float) 字符串 列表 字典 布尔值 数据类型介绍 不同的数据会有不同的数据类型 为了定义不同的数据,我们Python中提供了下述几个数据类型 ...
- HDU 2276 Kiki & Little Kiki 2( 矩阵快速幂 + 循环同构矩阵 )
蒟蒻的我还需深入学习 链接:传送门 题意:给出一个长度为 n,n 不超过100的 01 串 s ,每当一个数字左侧为 1 时( 0的左侧是 n-1 ),这个数字就会发生改变,整个串改变一次需要 1s ...
- HDU 5914 Triangle
题目来源:2016 CCPC 长春站 题意:青蛙先生想用n个长度为1~n的木棍来组成一些三角形,但是有一个坏蛋就想破坏青蛙先生的好事,请问在这n个木棍中至少偷出来几个木棍使得青蛙先生无法再用剩下的一些 ...