欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

守望者的逃离

程序员文章站 2022-09-17 08:19:04
P1095 守望者的逃离,dp...

守望者的逃离\operatorname{守望者的逃离}

题目链接:luogu P1095\operatorname{luogu\ P1095}

题目

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

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

输入

共一行,包括空格隔开的三个非负整数 M,S,TM, S, T

输出

共两行。

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

22 行包含一个整数。第一行为“ YesYes ”(区分大小写)时表示守望者逃离荒岛的最短时间;第一行为“ NoNo ”(区分大小写)时表示守望者能走的最远距离。

样例输入1

39 200 4

样例输出1

No
197

样例输入2

36 255 10

样例输出2

Yes
6

数据范围

30%30\% 的数据满足: 1T10,1S1001 \le T \le 10, 1 \le S \le 100

50%50\% 的数据满足: 1T<1000,1S100001 \le T < \le 1000, 1 \le S \le 10000

100%100\% 的数据满足: 1T300000,0M1000,1S1081 \le T \le 300000,0 \le M \le 1000, 1 \le S \le 10^8 .

思路

这道题是一道 dp 。

先预处理全部跑步,跑不了步就休息的情况。
接着就看走路的,就是 f[i]=f[i1]+17f[i] = f[i - 1] + 17 ,然后和之前的 f[i]f[i] 比较取最大的那个,如果已经超过了 ss 就可以逃出,直接输出答案结束。
如果枚举玩都走不出去,就没救了,就输出不可以走出,再输出 f[t]f[t] ,就是最后最多能走多少。

代码

#include<cstdio>
#include<iostream>

using namespace std;

int m, s, t, f[300001];

int main() {
	scanf("%d %d %d", &m, &s, &t);//读入
	
	for (int i = 1; i <= t; i++)//只闪现
		if (m >= 10) {
			m -= 10;
			f[i] = f[i - 1] + 60;
		}
		else {//闪不了现,休息
			m += 4;
			f[i] = f[i - 1];
		}
	
	for (int i = 1; i <= t; i++) {//走路
		f[i] = max(f[i], f[i - 1] + 17);
		if (f[i] >= s) {//找到答案
			printf("Yes\n%d", i);
			return 0;
		}
	}
	
	printf("No\n%d", f[t]);//跑不走
	
	return 0;
}

本文地址:https://blog.csdn.net/weixin_43346722/article/details/107899154

相关标签: # 动态规划