洛谷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,只有处在原地 ...
随机推荐
- Java 虚拟机JVM
定义 Java Virtual Machine:Java程序的运行环境(Javae二进制字节码的运行环境),相比C++有以下好处: 一次编写,到处运行 自动内存管理,垃圾回收功能 数组下标越界检查 多 ...
- php sockets扩展安装
php sockets扩展安装 今天安装cacti发现需要php sockets扩展,而现在的lnmp没有安装,于是想到了phpzie工具安装扩展,安装方法如下: cd php-5.3.8/ext ...
- 用C语音编写python的扩展模块,也就是python调c库
用C语音编写python的扩展模块,也就是python调c库 1.用C语言扩展Python的功能: http://www.ibm.com/developerworks/cn/linux/l-pyt ...
- telnet ip 端口
telnet ip 端口 1.关闭防火墙, 2.配置防火墙,出入端规则
- mysql DEFAULT约束 语法
mysql DEFAULT约束 语法 作用:用于向列中插入默认值. 说明:如果没有规定其他的值,那么会将默认值添加到所有的新记录.直线电机 mysql DEFAULT约束 示例 //在 "P ...
- POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)
题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...
- POJ 1161 Walls ( Floyd && 建图 )
题意 : 在某国,城市之间建起了长城,每一条长城连接两座城市.每条长城互不相交.因此,从一个区域到另一个区域,需要经过一些城镇或者穿过一些长城.任意两个城市A和B之间最多只有一条长城,一端在A城市, ...
- Laya layout算法
/** * <p>重置对象的 <code>X</code> 轴(水平方向)布局.</p> * @private */ public function r ...
- AT2371 Placing Squares
题解 考虑\(dp\) \[ dp[i]=\sum_{i=0}^{i-1}dp[j]*(i-j)^2 \] 我们可以设\((i-j)\)为\(x\),那么随着\(i\)向右移动一格,每个\(x\)都是 ...
- elasticsearch堆内存的配置建议
1.将最小堆大小(Xms)和最大堆大小(Xmx)设置为彼此相等 防止内存抖动 2:给多大的堆内存? 给ES的内存配置不是越大越好,建议不能超过32GB,不同jdk版本最大边界值是不同的,对于32位小于 ...