飞扬的小鸟【NOIP2014提高组】

题目描述

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

为了简化问题,我们对游戏规则进行了简化和改编: 
1.游戏界面是一个长为 n,高为 m 的二维平面,其中有k 个管道(忽略管道的宽度)。 
2.小鸟始终在游戏界面内移动。小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成。 
3.小鸟每个单位时间沿横坐标方向右移的距离为 1,竖直移动的距离由玩家控制。如果点击屏幕,小鸟就会上升一定高度 X,每个单位时间可以点击多次,效果叠加;如果不点击屏幕,小鸟就会下降一定高度 Y。小鸟位于横坐标方向不同位置时,上升的高度 X 和下降的高度 Y 可能互不相同。 
4.小鸟高度等于 0 或者小鸟碰到管道时,游戏失败。小鸟高度为 m 时,无法再上升。

现在,请你判断是否可以完成游戏。如果可以,输出最少点击屏幕数;否则,输出小鸟最多可以通过多少个管道缝隙。

输入格式

第 1 行有 3 个整数 n,m,k,分别表示游戏界面的长度,高度和水管的数量,每两个整数之间用一个空格隔开。

接下来的 n 行,每行 2 个用一个空格隔开的整数 X 和 Y,依次表示在横坐标位置 0~n-1 上玩家点击屏幕后,小鸟在下一位置上升的高度 X,以及在这个位置上玩家不点击屏幕时,小鸟在下一位置下降的高度 Y。

接下来 k 行,每行 3 个整数 P,L,H,每两个整数之间用一个空格隔开。每行表示一个管道,其中 P 表示管道的横坐标,L 表示此管道缝隙的下边沿高度为 L,H 表示管道缝隙上边沿的高度(输入数据保证 P 各不相同,但不保证按照大小顺序给出)。

输出格式

输出文件共两行:
第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0。 
第二行,包含一个整数,如果第一行为 1,则输出成功完成游戏需要最少点击屏幕数,否则,输出小鸟最多可以通过多少个管道缝隙。

样例数据 1

输入

10 10 6 
3 9 
9 9 
1 2 
1 3 
1 2 
1 1 
2 1 
2 1 
1 6 
2 2 
1 2 7 
5 1 5 
6 3 5 
7 5 8 
8 7 9 
9 1 3

输出


6

样例数据 2

输入

10 10 4 
1 2 
3 1 
2 2 
1 8 
1 8 
3 2 
2 1 
2 1 
2 2 
1 2 
1 0 2 
6 7 9 
9 1 4 
3 8 10

输出


3

备注

【样例说明】 
如下图所示,蓝色直线表示小鸟的飞行轨迹,红色直线表示管道。

【数据范围】 
对于 30% 的数据:5≤n≤10,5≤m≤10,k=0,保证存在一组最优解使得同一单位时间最多点击屏幕 3 次;
对于 50% 的数据:5≤n≤20,5≤m≤10,保证存在一组最优解使得同一单位时间最多点击屏幕 3 次; 
对于 70% 的数据:5≤n≤1000,5≤m≤100; 
对于 100% 的数据:5≤n≤10000,5≤m≤1000,0≤k<n,0<X<m,0<Y<m,0<P<n,0≤L<H ≤m,L+1<H。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
inline int readint()
{int i=0,f=1;char ch;for(ch=getchar();ch<'0'||ch>'9';ch=getchar());for(;ch>='0' && ch<='9';ch=getchar())i=(i<<3)+(i<<1)+ch-'0';return i*f;
}
int main()
{freopen("1.in","r",stdin);register int i,j;int n,m,k,p,ans;static int up[10001],down[10001],x[10001],y[10001],f[10001][1001];n=readint();m=readint();k=readint();up[n]=m+1;for(i=0;i<n;++i) x[i]=readint(),y[i]=readint(),up[i]=m+1;for(i=1;i<=k;++i) p=readint(),down[p]=readint(),up[p]=readint();memset(f,127,sizeof(f));for(i=1;i<=m;++i) f[0][i]=0;for(i=1;i<=n;++i){for(j=x[i-1];j<=m;++j){f[i][j]=min(f[i][j],f[i-1][j-x[i-1]]+1);f[i][j]=min(f[i][j],f[i][j-x[i-1]]+1);}for(j=m-x[i-1];j<=m;++j){f[i][m]=min(f[i][m],f[i-1][j]+1);f[i][m]=min(f[i][m],f[i][j]+1);}for(j=down[i]+1;j<=up[i]-1;++j)if(j+y[i-1]<=m)f[i][j]=min(f[i][j],f[i-1][j+y[i-1]]);for(j=1;j<=down[i];++j)f[i][j]=2139062143;for(j=up[i];j<=m;++j)f[i][j]=2139062143;}ans=2139062143;int cnt=k;for(i=n;i>=1;--i){for(j=down[i]+1;j<up[i];++j)ans=min(ans,f[i][j]);if (ans!=2139062143) break;if(up[i]!=m+1) --cnt;}if (cnt==k)printf("1\n%d\n",ans);elseprintf("0\n%d\n",cnt);return 0;
}
var
i,j,n,m,k,p,ans,cnt:longint;
up,down,x,y:array [0..10000] of longint;
f:array [0..10000,0..1000] of longint;
beginread(n,m,k);up[n]:=m+1;for i:=0 to n-1 do beginread(x[i],y[i]);up[i]:=m+1;end;for i:=1 to k do beginread(p);read(down[p],up[p]);end;for i:=1 to n dofor j:=0 to m do f[i][j]:=1000000;f[0][0]:=1000000;for i:=1 to n do beginfor j:=x[i-1] to m do beginif f[i-1][j-x[i-1]]+1 < f[i][j] then f[i][j]:=f[i-1][j-x[i-1]]+1;if f[i][j-x[i-1]]+1 < f[i][j] then f[i][j]:=f[i][j-x[i-1]]+1;end;for j:=m-x[i-1] to m do beginif f[i-1][j]+1 < f[i][m] then f[i][m]:=f[i-1][j]+1;if f[i][j]+1 < f[i][m] then f[i][m]:=f[i][j]+1;end;for j:=down[i]+1 to up[i]-1 doif j+y[i-1] <= m thenif f[i-1][j+y[i-1]] < f[i][j] then f[i][j]:=f[i-1][j+y[i-1]];for j:=1 to down[i] do f[i][j]:=1000000;for j:=up[i] to m do f[i][j]:=1000000;end;ans:=1000000;cnt:=k;for i:=n downto 1 do beginfor j:=down[i]+1 to up[i]-1 doif f[i][j] < ans then ans:=f[i][j];if ans <> 1000000 then break;if up[i] <> m+1 then cnt:=cnt-1;end;if cnt=k then beginwriteln('1');write(ans);endelse beginwriteln('0');write(cnt);end;
end.

C++——NOIP提高组——飞扬的小鸟相关推荐

  1. P1941 [NOIP2014 提高组] 飞扬的小鸟

    题目来源 [NOIP2014 提高组] 飞扬的小鸟 - 洛谷 题目考点 动态规划,dp    枚举,暴力    背包 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点 ...

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

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

  3. P1941 [NOIP2014 提高组] 飞扬的小鸟——解题报告

    一.题目链接: P1941 [NOIP2014 提高组] 飞扬的小鸟 二.题目大意 游戏界面是一个长为nnn,高为mmm的二维平面,其中有kkk个管道(忽略管道的宽度).小鸟始终在游戏界面内移动.小鸟 ...

  4. 2018.12.08【NOIP提高组】模拟B组总结(未完成)

    2018.12.08[NOIP提高组]模拟B组总结 diyiti 保留道路 进化序列 B diyiti Description 给定n 根直的木棍,要从中选出6 根木棍,满足:能用这6 根木棍拼出一个 ...

  5. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

  6. 津津的储蓄计划 NOIp提高组2004

    这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...

  7. 信息学奥赛一本通(C++版)NOIP提高组(1820-1829)

    信息学奥赛一本通(C++版)NOIP提高组目录 //1820 [题目描述] 我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所 处位置的(值减1)为指数,以10为底数的幂之和的 ...

  8. {小结}2016.6.11【初中部 NOIP提高组 】模拟赛C

    2016.6.11[初中部 NOIP提高组 ]模拟赛C No.1!!! 100+33.3+10+90=233.3 23333 1298. 牛棚(graze2.pas/c/cpp) 题解 1299. 洗 ...

  9. 6271. 2019.8.4【NOIP提高组A】锻造 (forging)

    6271. 2019.8.4[NOIP提高组A]锻造 (forging)  (File IO): input:forging.in output:forging.out Time Limits: 15 ...

最新文章

  1. 文件翻译002片:Process Monitor帮助文档(Part 2)
  2. Web生产:外部JS文件中的绝对URL?
  3. 小尼机器人_小尼被机器人嫌弃“唱歌难听,长相一般”?
  4. c# WebApi之接口返回类型详解
  5. Deep Alignment Network(人脸对齐)
  6. Go程序:演示复数类型的用法
  7. 单片机拼字程序怎么做_小程序商城怎么做?做一个小程序需要多少钱
  8. 2.5 结构化程序设计的方法
  9. 结对-贪吃蛇游戏-测试过程
  10. Android下ping的简单工具类
  11. 未来教育mysql下载_未来教育计算机二级题库中的视频为什么无法播放
  12. 中国优秀软件架构师感悟录
  13. EIQ分析法_配送中心
  14. 身份证号码 如何把格式设置成18个格子
  15. 影响力在职场的重要性
  16. 极狐阿尔法S 全新HI版在上海率先推送城区NCA
  17. oracle 导入攻略,oracle10g下expdp自动导出并上传全攻略
  18. 第五章. 可视化数据分析图表—常用图表的绘制2—直方图,饼形图
  19. php 横线,文字下面加横线怎么弄
  20. 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。

热门文章

  1. win10 10074版本qq显示问题
  2. 深入浅出LDA(1)
  3. 第一段代码 打开了新世界的大门
  4. 用python判断闰年
  5. 织梦cms教程:自定义表单添加提交时间
  6. [Vs提示:不允许使用不完整类型]使用结构体常犯的错误
  7. 亚信安全为80%入围中国银行提供安全防护
  8. Cerberus恶意软件团队解散,10万美元拍卖源代码工程
  9. angular js 循环数据(死数据) 添加数据 隔行换色 单个删除 排序
  10. 我的收藏----壁纸