小毛驴要回家了,凭借着刚从老毛驴处学到的闪烁魔法,小毛驴信心满满地出发了。这一次它来到了另一条死亡隧道口,但是,小毛驴不知道死亡威胁随时存在,因为它所打算穿过的这条死亡隧道即将于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数组为下一波可怜娃做准备
}
}