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 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...
随机推荐
- 【BZOJ 2821】作诗
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2821 [算法] 如果不强制在线,显然莫队是可以解决此题的,那么,强制在线怎么办呢? ...
- Hadoop 三剑客之 —— 分布式文件存储系统 HDFS
一.介绍 二.HDFS 设计原理 2.1 HDFS 架构 2.2 文件系统命名空间 2.3 数据复制 2.4 数据复制的实现原理 2.5 副本的选择 2 ...
- 为IT程序员量身定制的12个目标——很经典
对程序员们来说挑战自我非常重要,要么不断创新,要么技术停滞不前.新年伊始,我整理了12个月的目标,每个目标都是对技术或个人能力的挑战,而且可以年复一年循环使用. 01. 变得有耐心 02. 保持健康 ...
- NOIp2018之前打模板出现的问题汇总
灵感来源是因为调试了一下午dij,就想把错误记下来 dij:结构体里的重载运算符不会写 结构体声明后要加引号 用于排序的结构体按照边长度排序 匈牙利:在dfs中的if语句中,要继续搜 ...
- Rsync 服务器搭建
Rsync简介 rsync 是一个 Unix 系统下的文件同步和传输工具. 它具备以下特性: 1. 能更新整个目录和树和文件系统 2. 有选择性的保持符号链链.硬链接.文件属于.权限.设备以及时间 等 ...
- Axure设计软件下载安装及注册
如图:本地计算机安装了两个版本的Axure,但8版的有问题,点击保存软件就退出了:7版本要想使用的注册授权 https://blog.csdn.net/botree_chan/article/deta ...
- 什么是CNN--Convolutional Neural Networks
是近些年在机器视觉领域很火的模型,最先由 Yan Lecun 提出. 如果想学细节可以看 Andrej Karpathy 的 cs231n . How does it work? 给一张图片,每个圆负 ...
- popupwindows
<1>.能够点击popupwindow 内部空间,外部触摸消失,外部点击事件. package myapplication.com.myapplication; import androi ...
- ZBrush中如何反选遮罩
通过对ZBrush的学习,我们知道了如何手动创建遮罩,手动创建遮罩相对来说是最简单有效的方法,在某些特定的使用场合会起到事半功倍的效果.创建遮罩我们可以结合Ctrl键在物体保持编辑的状态下来执行,您可 ...
- table标签 在谷歌和ie浏览器下不同的表现效果
在项目中有了一个这样的需求: 我需要利用vue的模板语法v-for循环生成tr,这个tr是需要双重循环来确定其个数的, 我的实现: 我在tr外面包了一个template标签, 效果: 谷歌浏览器下实现 ...