问题 C: 守望者的逃离
时间限制: 1 Sec 内存限制: 128 MB
题目描述
恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。
现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。
你的任务写写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位,且每次活动的持续时间为整数秒。距离的单位为米(m)。
输入
输入仅一行,包括空格隔开的三个非负整数M,S,T。
输出
输出包括两行:
第1行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。
第2行包含一个整数。第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短时间;
第一行为“No”(区分大小写)时表示守望者能走的最远距离。
样例输入 Copy
39 200 4
样例输出 Copy
No
197
错误代码:(手写选择,莫名其妙的错了,还没来得及看错哪了…)
#include <iostream>
using namespace std;
int main()
{
int M,S,T;
cin>>M>>S>>T;
int l=M%10;
int k=(M/10)*60;
int t=T-M/10;
int maxs;
int mint;
if(l<2){
if(S%17==0){
mint=S/17;
}else{
mint=S/17+1;
}
}else if(l>=2&&l<6){
if(t>=3){
if((S-60)%17==0){
mint=(S-60)/17+3;
}else{
mint=(S-60)/17+4;
}
t=t-3;
k=k+60;
}else{
if(S%17==0){
mint=S/17;
}else{
mint=S/17+1;
}
}
}else if(l>=6&&l<8){
if(t>=2){
if((S-60)%17==0){
mint=(S-60)/17+2;
}else{
mint=(S-60)/17+3;
}
t=t-2;
k=k+60;
}else{
if(S%17==0){
mint=S/17;
}else{
mint=S/17+1;
}
}
}else if(l>=8){
if(t>=5){
if((S-120)%17==0){
mint=(S-120)/17+5;
}else{
mint=(S-120)/17+6;
}
t=t-5;
k=k+120;
}else if(t>=2){
if((S-60)%17==0){
mint=(S-60)/17+2;
}else{
mint=(S-60)/17+3;
}
t=t-2;
k=k+60;
}else{
if(S%17==0){
mint=S/17;
}else{
mint=S/17+1;
}
}
}
maxs=k+t*17;
if(maxs<S){
cout<<"No"<<endl;
cout<<maxs;
}else{
cout<<"Yes"<<endl;
cout<<mint;
}
return 0;
}
动态规划解决:
#include <iostream>
using namespace std;
/**
*用F[t]表示守望者在t时间内所能走的最远距离,
*G[t]表示守望者只使用闪烁法术在t时间内所能走的最远距离。
*则相应的状态转移方程为F[t] = max{F[t-1] + 17, G[t]}, F[0] = G[0] = 0
*
*/
int main()
{
int m, s, t;
int i, d1=0, d2=0;
cin>>m>>s>>t;
for (i=1;i<=t;i++) {
if (m>=10) {
d1+=60;
m=m-10;
} else {
m=m+4;
}
if (d1>d2+17){
d2=d1;
}
else{
d2+=17;
}
if (d2>=s){
break;
}
}
if(i>t){
cout<<"No"<<endl;
cout<<d2;
}else{
cout<<"Yes"<<endl;
cout<<i;
}
return 0;
}