贪心?-守望者的逃离

题目描述  Description

恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。

现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位,且每次活动的持续时间为整数秒。距离的单位为米(m)。

输入描述  Input Description

仅一行,包括空格隔开的三个非负整数MST

输出描述  Output Description

包含两行:

第1行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。

第2行包含一个整数。第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短时间;

第一行为“No”(区分大小写)时表示守望者能走的最远距离。

样例输入  Sample Input

39 200 4

样例输出  Sample Output

No

197

 

//对于这道题,可以以1s为单位进行考虑,即考虑这1s内的最远移动距离,然后+1s。

  所以在这一秒中,可以分为三种:

    1.只用瞬移;

    2.只用走;

    3.综合以上;

  然后分析位移的平均速度:

    1.当mp>=10时,瞬移的平均速度即60m/s。

    2.但当补魔5*1s时,获得mp=20,此时平均速度为120m/6s=20m/s>17m/s。

    3.任何时间均可以使用速度为17m/s的走位。

    4.当没有mp时,需要补魔3*1s,获得mp=12,可瞬移60m,而此时平均速度为60m/4s=15m/s<17m/s。

  综上,单纯瞬移比跑步快,但加上补魔就不一定了。所以可以排除方法2,那么如何得出方法3的最长位移呢?可以看出,我们会按照位移1.2.3.4的优先级使用。但是这样分析会出现一个问题,当剩余时间小于5s时,无法使用位移2,所以此时我们使用位移3。

  所以,经过优化后,我们只需要考虑以下两种行为模式:

    p1.只使用瞬移和补魔;

    p2.尽可能使用模式1,结合走位;采用以下方法实现:p2=max(p1,p2)。

  按照以上的方法,可以得出最优的位移方法。那么如果跑得出去,因为我们采用1s1s的推导,可以很容易的得出时间;那如果跑不出去,因为我们求出了最长位移,直接输出即可。

//具体代码如下

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int m1,s1,t1,p1[2],p2;
int main()
{
//*/
freopen("escape.in","r",stdin);
freopen("escape.out","w",stdout);//*/
int m,s,t,i,j,k,l,ans;
cin>>p1[0]>>s>>t;
l=t;
while(t>0){
if(p1[0]>=10) p1[0]-=10,p1[1]+=60;
else p1[0]+=4;
p2+=17;
p2=max(p2,p1[1]);
if(p2>=s) {
cout<<"Yes"<<endl<<l-t+1<<endl;
return 0;
}
t--;
}
cout<<"No"<<endl<<p2<<endl;
//*/
fclose(stdin);
fclose(stdout);//*/
return 0;
}

    

转载于:https://www.cnblogs.com/wengsy150943/p/5757373.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值