链接

题目描述

恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为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守望者的逃离题解-伪动态规划/贪心的更多相关文章

  1. 洛谷 P1095 守望者的逃离

    题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...

  2. 洛谷——P1095 守望者的逃离

    https://www.luogu.org/problem/show?pid=1095#sub 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交 ...

  3. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  4. P1095 守望者的逃离

    P1095 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这 ...

  5. luogu -P1095 守望者的逃离 - 分别DP

    P1095 守望者的逃离: https://www.luogu.org/problemnew/show/P1095 题意: 有一个人要在S长度的直线上跑过去,初始有M的魔法值,用10点魔法值可以在一秒 ...

  6. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  7. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  8. 【洛谷5008】逛庭院(Tarjan,贪心)

    [洛谷5008]逛庭院(Tarjan,贪心) 题面 洛谷 题解 如果图是一个\(DAG\),我们可以任意选择若干个不是入度为\(0\)的点,然后把它们按照拓扑序倒序删掉,不难证明这样一定是合法的. 现 ...

  9. 洛谷P1095 绝地武士的逃离

    好吧原题是守望者的逃离,我强行改了一波题面,因为信仰=-=(? May the force be with us. 绝地跑步速度为17m/s,但无法逃离荒岛.绝地的原力恢复速度为4点/s,只有处在原地 ...

随机推荐

  1. noip考前抱佛脚 数论小总结

    exCRT 求解韩信点兵问题,常见的就是合并不同\(mod\). 先mo一发高神的板子 for(R i=2;i<=n;++i){ ll Y1,Yi,lcm=Lcm(p[i],p[1]); exg ...

  2. Django【第24篇】:JS实现的ajax和同源策略

    JS实现的ajax和同源策略 一.回顾jQuery实现的ajax 首先说一下ajax的优缺点 优点: AJAX使用Javascript技术向服务器发送异步请求: AJAX无须刷新整个页面: 因为服务器 ...

  3. Django【第9篇】:Django之用户认证auth模块

    用户认证--------------auth模块 一.auth模块 from django.contrib import auth 1 .authenticate()   :验证用户输入的用户名和密码 ...

  4. 【leetcode】1104. Path In Zigzag Labelled Binary Tree

    题目如下: In an infinite binary tree where every node has two children, the nodes are labelled in row or ...

  5. springboot日期转换器

    注:该功能并非springboot特有的功能,springmvc同样具有         一.使用方法     创建一个DateConverter类实现Converter接口 注:importorg. ...

  6. 前端面试题常考&必考之--http中的post和get的区别

    从字面上看,post是发送,则是提交数据,get是获得,则是获取数据,没毛病,我们可以就按字面来理解 具体就看图吧 吐槽:插入的表格不好用,不知道是自己不会用还是真不好用,变成了截图,修饰了下子

  7. vue-cli3热更新配置,解决热更新失败的问题,保存代码浏览器自动刷新

    在vue,config.js中配置css热更新 const IS_PROD = ['production', 'test'].includes(process.env.NODE_ENV) css: { ...

  8. POJ 3261 Milk Patterns ( 后缀数组 && 出现k次最长可重叠子串长度 )

    题意 : 给出一个长度为 N 的序列,再给出一个 K 要求求出出现了至少 K 次的最长可重叠子串的长度 分析 : 后缀数组套路题,思路是二分长度再对于每一个长度进行判断,判断过程就是对于 Height ...

  9. Leetcode 9. Palindrome Number(水)

    9. Palindrome Number Easy Determine whether an integer is a palindrome. An integer is a palindrome w ...

  10. CSS的一些单位,如rem、px、em、vw、vh、vm

    总结了一下一些单位的不同 px:像素(pixel)相对长度单位,,是相对于屏幕显示器分辨率而言的: em:em的值并不是固定的,会集成父级元素的字体大小: 注意: 1.body选择其中声明Font-s ...