孤岛,隧道逃离问题(贪心+伪动态规划)

这是一道关于算法优化问题的编程题目,描述了一只小毛驴试图使用闪烁魔法穿越即将坍塌的死亡隧道。题目要求计算小毛驴能否在限定时间内成功穿越或最远能走多远。解决方案涉及贪心策略,通过初始化数组并判断每秒使用魔法或走路哪个更优来确定最短时间或最远距离。
摘要由CSDN通过智能技术生成

小毛驴要回家了,凭借着刚从老毛驴处学到的闪烁魔法,小毛驴信心满满地出发了。这一次它来到了另一条死亡隧道口,但是,小毛驴不知道死亡威胁随时存在,因为它所打算穿过的这条死亡隧道即将于T秒时间后坍塌。

已知小毛驴行走的速度是每秒17米,而小毛驴拥有的闪烁法术可以使它在1秒内移动60米,不过每次使用闪烁法术都会消耗魔法值10点。小毛驴也掌握了魔法恢复技能,但是必须通过原地休息来实现,且魔法值恢复的速度为每秒4点。

已知小毛驴当前的魔法初值为M,死亡隧道的长度为S,隧道将于T秒时间后坍塌。

请你帮助小毛驴计算能否成功穿越隧道,若不能穿过,也请你计算小毛驴在T秒时间内能走的最远距离。

说明: 1)当前小毛驴刚刚踏入隧道口,若在T秒时间内的移动距离大于等于S米的话,就算成功。 2)小毛驴行走、闪烁或者休息均以秒为单位。

输入格式:

输入数据首先包含一个整数T(1<=T<=50),表示测试实例的个数,然后是T组测试数据。 每组测试输入包括用空格隔开的三个非负整数M,S,T。 (M<1000,S<100000000,T<300000)

出格式:

若成功穿越,则输出"Yes",然后是小毛驴穿越隧道所需的最短时间,中间用一空格分割。 若穿越失败,则输出"No" ,然后是小毛驴在 T秒内能走的最远距离,中间用一空格分割。

输入样例:

4
40 240 4
40 241 4
39 200 4
36 255 10

输出样例:

Yes 4
No 240
No 197
Yes 6

本题分析:

        对于本题含有贪心思想求解:要逃离最快的话相比于走路正常人肯定会使用魔法啊,那么我们就设数组arr[i]为第i秒使用魔法能跑的最远距离,初始时魔法没有则只能停下来恢复魔法技能(因为目前我们只考虑使用魔法的最优情况)。

根据此思路我们可以初始化数组arr,接下来 进入循环判断每秒是使用魔法还是走路更合理,咱就直接上代码:

代码如下:(思路代码中给出) 

#include<bits/stdc++.h>
using namespace std;
int arr[1000000];
int main() {
	int t, m, s, tt;
	cin >> tt;
	while (tt--) {
		int  flag = 0;
		cin >> m >> s >> t;//魔法,路程,时间
		for (int i = 1; i <= t; i++) {//初始化一波(只考虑最优即使用魔法的情况)
			if (m >= 10) {
				arr[i] = arr[i - 1] + 60;
				m -= 10;
			}
			else {
				arr[i] = arr[i - 1]; m += 4;
            }
		}
		for (int i = 1; i <= t; i++) {
			arr[i] = max(arr[i], arr[i - 1] + 17);//第i秒的最优路径(使用魔法,走路)
			if (arr[i] >= s) {//此时的路径大于等于逃生范围则逃生成功
				cout << "Yes" << " " << i << endl; flag = 1; break;
			}
		}
		if (!flag)cout << "No" << " " << arr[t] << endl; //哦no,失败啦
		for (int i = 0; i <= t; i++)arr[i] = 0;//重新初始化一波arr数组为下一波可怜娃做准备
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值