洛谷P1095守望者的逃离题解-伪动态规划/贪心
链接
题目描述
恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。
现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位,且每次活动的持续时间为整数秒。距离的单位为米(m)。
输入输出格式
输入格式:
共一行,包括空格隔开的三个非负整数M,S,T。
输出格式:
共两行。
第1行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。
第2行包含一个整数。第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短时间;第一行为“No”(区分大小写)时表示守望者能走的最远距离。
输入输出样例
输入样例#1:39 200 4输出样例#1:No 197输入样例#2:36 255 10输出样例#2:Yes 6说明
30%的数据满足:1≤T≤10,1≤S≤100
50%的数据满足:1≤T<≤1000,1≤S≤100001
100%的数据满足:1≤T≤300000,0≤M≤1000,1≤S≤10的8次方
机房dalao:一看就是弱智dp题。然后他切了。但是我因为太菜第一想法是全都进行闪现。下面进行分析。
每次恢复魔力值10点需要2.5s,再用1s进行60m的闪现,60/3.5大概是17.14m/s的速度,刚出发的时候还有一些魔力值。跑步速度是17m/s,这样看来似乎闪现是最优选,我们愉快的贪心吧!!于是我立马写了个代码交上:
1 #include <iostream> 2 using namespace std; 3 int m,s,t,su; 4 int main() 5 { 6 cin>>m>>s>>t; 7 for(int i=1;i<=t;i++) 8 { 9 if(m>=10) 10 { 11 m-=10; 12 su+=60; 13 } 14 else 15 m+=4; 16 if(su>=s) 17 { 18 cout<<"Yes"<<endl<<i; 19 return 0; 20 } 21 } 22 cout<<"No"<<endl<<su; 23 return 0; 24 }
果断就会白给
很好,样例都没过。但是我怎么可能这么轻易认输呢,我干脆点了提交。
虽然WA了一半,但A了一半说明它并不是全无道理。或许可以推出正确的思路呢?
以样例为例,39 200 4这组数据正确的最远距离结果是197,这份代码输出的结果则是180.我们可以看出来,最后一秒中本可以跑步17m,这份代码却会让守望者原地等待。
再看36 255 10这组,正确的最短时间是6s,这份程序的结果是9s。我们人工模拟一下,可以发现在5s-6s时我们可以选择跑步啊!而这个废物代码却会原地等待3s后再进行闪现。
这时我又觉得我会了!只要判断一下不就好了吗!
1 #include <iostream> 2 using namespace std; 3 int m,s,t,su; 4 int main() 5 { 6 cin>>m>>s>>t; 7 for(int i=1;i<=t;i++) 8 { 9 if(s-su<=17) 10 { 11 cout<<"Yes"<<endl<<i; 12 return 0; 13 } 14 if(i==t&&m<10) 15 { 16 cout<<"No"<<endl<<su+17; 17 return 0; 18 } 19 if(m>=10) 20 { 21 m-=10; 22 su+=60; 23 } 24 else 25 m+=4; 26 if(su>=s) 27 { 28 cout<<"Yes"<<endl<<i; 29 return 0; 30 } 31 } 32 cout<<"No"<<endl<<su; 33 return 0; 34 }
犹豫就会败北
好,这次看起来好多了,我们再提交一下试试。
只是多A了一个点,说明优化还是有问题。思考过后我们可以想到,每秒中我们有三种决定:闪现、跑步和停留。停留和闪现可以合并在一起,我们的优化只给了最后一秒跑步的选择。
于是我们可以运用一种似乎很像动态规划的解法啦!我们先假设全部进行闪现-停留-闪现操作,再加一个循环判断每秒的最优决策究竟是闪现-停留还是跑步。我们用dp[i]数组表示第i秒时守望者所能到的最远距离。
1 #include <iostream> 2 using namespace std; 3 long long m,s,t,dp[300001];//dp[i]数组表示第i秒时守望者所能到的最远距离 4 int main() 5 { 6 cin>>m>>s>>t; 7 for(int i=1;i<=t;i++)//相当于第一次提交的程序 8 if(m>=10) 9 { 10 m-=10; 11 dp[i]=dp[i-1]+60; 12 } 13 else 14 { 15 m+=4; 16 dp[i]=dp[i-1]; 17 } 18 for(int i=1;i<=t;i++) 19 { 20 dp[i]=max(dp[i],dp[i-1]+17);//如果在第i秒时跑步能到达更远距离,我们跑步 21 if(dp[i]>=s)//已到达就可以输出+结束程序啦 22 { 23 cout<<"Yes"<<endl<<i; 24 return 0; 25 } 26 } 27 cout<<"No"<<endl<<dp[t];//如果进行到了这里说明无法逃离,我们输出能到达的最远距离 28 return 0; 29 }
人生不如意十有八九
这次的样例也过了,于是我们提交一下。
一道黄题耗我十五分钟我果然还是太菜了
这样就通过了!如果有兴趣的话大家可以研究一下暴力写法,也是能过的(我懒得想了
谨记教训:犹豫就会败北,果断就会白给!!!
转载于:https://www.cnblogs.com/BatmanWhoLaughs/p/10873997.html
洛谷P1095守望者的逃离题解-伪动态规划/贪心相关推荐
- 洛谷 P1095 守望者的逃离 题解 (附题目)
注:题目解析及代码请往下拉,题面如下: 题面 P1095 [NOIP2007 普及组] 守望者的逃离 题目描述 守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上. 为了杀死守望者,尤迪安开始 ...
- 洛谷P1095 守望者的逃离 dp
https://www.luogu.org/problem/P1095 题目描述恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个 ...
- 洛谷P1095 守望者的逃离 (从未感觉DP如此清晰, 所以这是DP吗2333)
恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去.到 ...
- 洛谷 P1095 守望者的逃离
题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...
- NOIP200703守望者的逃离 题解
NOIP200703守望者的逃离 题解 题目 链接 字面描述 题目背景 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 提示 思路 ...
- 【每日DP】day 5、P1095 守望者的逃离(好像悟到了DP的真谛)难度⭐⭐★
P1095 守望者的逃离 输入 39 200 4 输出 No 197 输入 36 255 10 输出 Yes 6 好像悟到了DP的真谛(doge) 动态规划,就是动态地维护当前的状态. 本题种状态是距 ...
- 洛谷P1129 [ZJOI2007] 矩阵游戏 题解
洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...
- 洛谷P3336 [ZJOI2013]话旧 题解
洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...
- 洛谷P4683 [IOI2008] Type Printer 题解
洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...
最新文章
- 快来试试 Spring Boot 应用可视化监控,一目了然!
- 超像素、语义分割、实例分割、全景分割 傻傻分不清?
- Docker基本使用命令
- mysql useradd_useradd失败
- 18岁的他从月薪2000到月薪11000经历了什么?
- windows mobile 鼠标等待
- 聊聊高并发(五)理解缓存一致性协议以及对并发编程的影响
- selenium+Java自动化
- SELECT语句,去除某个字段的重复信息
- java获取IP地址:
- Oracle使用systimestamp取微秒
- The type XXX is not API (restriction on required library 'D:\jdk-64\jre\lib\rt.jar')
- 计算机组成原理学习-哈工大《计算机组成原理》第四章-上篇
- Matlab中滤波操作的相关函数
- Mybatis generator 生成xml文件时覆盖原文件
- 学习RAID磁盘阵列
- permissions is only granted to system apps
- 为什么没什么人玩呢?凰华学院主校剧情有感
- 和刘备相关的人(九 )
- HTML邮件制作心得
热门文章
- Nginx的upstream_response_time
- Http请求url参数字符集
- visual studio 2015开发nodejs教程1搭建环境
- Service Mesh 和 API Gateway 关系深度探讨
- 你写的 Java 代码是如何一步步输出结果的
- Linux 常用命令全称,看看你 get 到了哪些?
- WSP框架:WEB组件的原理
- 动态规划:连续子数组的最大和
- html图片墙 无限滚动,尝试用CSS3实现无限循环的无缝滚动
- android 上滑隐藏view,Android CoordinatorLayout + AppBarLayout(向上滚动隐藏指定的View)