洛谷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,这样看来似乎闪现是最优选,我们愉快的贪心吧!!于是我立马写了个代码交上:
#include <iostream>
using namespace std;
int m,s,t,su;
int main()
{
cin>>m>>s>>t;
for(int i=;i<=t;i++)
{
if(m>=)
{
m-=;
su+=;
}
else
m+=;
if(su>=s)
{
cout<<"Yes"<<endl<<i;
return ;
}
}
cout<<"No"<<endl<<su;
return ;
}
果断就会白给
很好,样例都没过。但是我怎么可能这么轻易认输呢,我干脆点了提交。
虽然WA了一半,但A了一半说明它并不是全无道理。或许可以推出正确的思路呢?
以样例为例,39 200 4这组数据正确的最远距离结果是197,这份代码输出的结果则是180.我们可以看出来,最后一秒中本可以跑步17m,这份代码却会让守望者原地等待。
再看36 255 10这组,正确的最短时间是6s,这份程序的结果是9s。我们人工模拟一下,可以发现在5s-6s时我们可以选择跑步啊!而这个废物代码却会原地等待3s后再进行闪现。
这时我又觉得我会了!只要判断一下不就好了吗!
#include <iostream>
using namespace std;
int m,s,t,su;
int main()
{
cin>>m>>s>>t;
for(int i=;i<=t;i++)
{
if(s-su<=)
{
cout<<"Yes"<<endl<<i;
return ;
}
if(i==t&&m<)
{
cout<<"No"<<endl<<su+;
return ;
}
if(m>=)
{
m-=;
su+=;
}
else
m+=;
if(su>=s)
{
cout<<"Yes"<<endl<<i;
return ;
}
}
cout<<"No"<<endl<<su;
return ;
}
犹豫就会败北
好,这次看起来好多了,我们再提交一下试试。
只是多A了一个点,说明优化还是有问题。思考过后我们可以想到,每秒中我们有三种决定:闪现、跑步和停留。停留和闪现可以合并在一起,我们的优化只给了最后一秒跑步的选择。
于是我们可以运用一种似乎很像动态规划的解法啦!我们先假设全部进行闪现-停留-闪现操作,再加一个循环判断每秒的最优决策究竟是闪现-停留还是跑步。我们用dp[i]数组表示第i秒时守望者所能到的最远距离。
#include <iostream>
using namespace std;
long long m,s,t,dp[];//dp[i]数组表示第i秒时守望者所能到的最远距离
int main()
{
cin>>m>>s>>t;
for(int i=;i<=t;i++)//相当于第一次提交的程序
if(m>=)
{
m-=;
dp[i]=dp[i-]+;
}
else
{
m+=;
dp[i]=dp[i-];
}
for(int i=;i<=t;i++)
{
dp[i]=max(dp[i],dp[i-]+);//如果在第i秒时跑步能到达更远距离,我们跑步
if(dp[i]>=s)//已到达就可以输出+结束程序啦
{
cout<<"Yes"<<endl<<i;
return ;
}
}
cout<<"No"<<endl<<dp[t];//如果进行到了这里说明无法逃离,我们输出能到达的最远距离
return ;
}
人生不如意十有八九
这次的样例也过了,于是我们提交一下。
一道黄题耗我十五分钟我果然还是太菜了
这样就通过了!如果有兴趣的话大家可以研究一下暴力写法,也是能过的(我懒得想了
谨记教训:犹豫就会败北,果断就会白给!!!
洛谷P1095守望者的逃离题解-伪动态规划/贪心的更多相关文章
- 洛谷 P1095 守望者的逃离
题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...
- 洛谷——P1095 守望者的逃离
https://www.luogu.org/problem/show?pid=1095#sub 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交 ...
- 洛谷P1783 海滩防御 分析+题解代码
洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...
- P1095 守望者的逃离
P1095 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这 ...
- luogu -P1095 守望者的逃离 - 分别DP
P1095 守望者的逃离: https://www.luogu.org/problemnew/show/P1095 题意: 有一个人要在S长度的直线上跑过去,初始有M的魔法值,用10点魔法值可以在一秒 ...
- 洛谷P4047 [JSOI2010]部落划分题解
洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...
- 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)
洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...
- 【洛谷5008】逛庭院(Tarjan,贪心)
[洛谷5008]逛庭院(Tarjan,贪心) 题面 洛谷 题解 如果图是一个\(DAG\),我们可以任意选择若干个不是入度为\(0\)的点,然后把它们按照拓扑序倒序删掉,不难证明这样一定是合法的. 现 ...
- 洛谷P1095 绝地武士的逃离
好吧原题是守望者的逃离,我强行改了一波题面,因为信仰=-=(? May the force be with us. 绝地跑步速度为17m/s,但无法逃离荒岛.绝地的原力恢复速度为4点/s,只有处在原地 ...
随机推荐
- AGC014做题记录
貌似是比较水的一场 可是我依然8会做 C 发现除了第一步以外的走法都不会受到锁的影响并且一定选四个方向距离最近的径直走过去 那么第一步能走到的联通块取个min就好了 (我竟然第一发特别认真的写了一个D ...
- Spring Boot日志处理
2.4 日志处理 2.4.1 记录日志内容 请求url 访问者ip 调用方法classMethod 参数args 返回内容 2.4.2 新建包aspect,新建日志切面处理类 package com. ...
- VS2015开发常用快捷键
以下内容均Ctrl+后面的按钮 M-O\P折叠 K-F 格式化 K-U\C注释 K-S侧外代码-(区域代码) 代码片段 ctor 自动生成默认的构造函数 prop 自动生成get set方法 cw 自 ...
- sql视频学习关键笔记(自用记单词与学习用)
sql字段类型 numeric(18,3)-18位整数加3位小数点(货币计量最好选这类型) sql关键字 insert. update. delete alter grant 授权. revoke 回 ...
- Python---进阶---常用模块os、jso
一.写一个6位随机验证码程序(使用 random模块),要求验证码中至少包含一个数字.一个小写字母.一个大写字母 import randomimport string #help(string) co ...
- hdu 3572 : Task Schedule (网络流)
题目链接 题意: 有M个机器,N个任务 对第i个任务,需要在[Si,Ei]这段时间内恰有Pi天被process 每天最多有M个机器同时工作 每一天,一个任务若被process,那么它恰占用一个机器. ...
- Vue 基于node npm & vue-cli & element UI创建vue单页应用
基于node npm & vue-cli & element UI创建vue单页应用 开发环境 Win 10 node-v10.15.3-x64.msi 下载地址: https ...
- onmouseover和onmouseout鼠标移入移出切换图片的几种实现方法
鼠标移入移出图片切换很常见的,那我们就来说说他的写法 第一种方法,也是最简单的一种,在html:里就可实现 <img class="img" src="img/do ...
- #1024-JSP结构
JSP 结构 网络服务器需要一个JSP引擎,也就是一个容器来处理JSP页面.容器负责截获对JSP页面的请求. JSP容器与Web服务器协同合作,为JSP的正常运行提供必要的运行环境和其他服务,并且能够 ...
- slider组件
slider组件,是一个强大的滑动选择器组件: 属性: min:类型 数字 滑动选择器的(范围)最小值 max:类型 数字 滑动选择器的(范围)最大值 step:类型 数字 步长(滑一次走的距离) ...