2014华为机试题15:洞穴逃生

来源:互联网 发布:无烟艾灸仪 知乎 编辑:程序博客网 时间:2024/04/27 18:30

/*王子的状态有以下几种情形:
1、在魔法值充分的情形下,优先连续闪烁,每秒移动距离是 60/1=60 米;
在魔法值m不够充分的情形下,应该尽可能考虑原地休息恢复然后闪烁,按m值分三种情形,优先考虑第2情形,
2、m>=6,休息1秒后闪烁,每秒移动距离是 60/2=30 米;
3、2<=m<6,休息2秒后闪烁,每秒移动距离是 60/3=20 米;
4、m<2,休息3秒后闪烁,这样每秒移动距离是 60/4=15 米,比直接跑移动的还少,好像没什么价值。不过闪烁后能至少剩下m>=2,能转换到2情形,这样两次合起来是休息5秒闪烁2次,平均每秒移动距离是 120/7=17.14,额,比单纯跑步快一丁点,^_^
这种情形比较特殊,只有在剩下距离不少于120米的情况下适应,否则需要拆开来考虑;
5、最后一种情形是选择直接跑,只应在最后一步才选择。条件是如果剩余时间无法满足以上2和3两种休息后闪烁的情形,或者距离出口距离小于60米时需要在直接跑与休息后闪烁之间比较。
注意以上第4种情形非常特别,强调条件,距离必须不少于120米,否则不能成立,这应当是考虑时最容易混淆出错的地方吧
*/
#include "stdio.h"

int main()
{
    int M, S, T;
    int moved = 0, time = 0;
scanf("%d%d%d",&M,&S,&T);


    while(moved<S && T-time>0)
    {
        if(M>=10)    // 情形 1 魔法值大于等于10,优先闪烁
        {
            moved += 60;
            time++;
            M -= 10;
        }
        else if(M>=6 && T-time>=2 && S-moved>34)     // 情形 2
        {
            moved += 60;
            time += 2;
            M -= 6;
        }
        else if(M>=2 && T-time>=3 && S-moved>51)    // 情形 3
        {
            moved += 60;
            time += 3;
            M -= 2;
        }
        else if(T-time>=7 && S-moved>=120)    // 情形 4 
        {
            moved += 120;
            time += 7;
        }
        else    // 情形 5
        {
            int n1 = T-time;
            int n2 = (S-moved+16)/17;//考虑最后不足17m的情况 所以要加上16 不然的话就不能得到1
            int n = n1<n2 ? n1 : n2;
            moved += n * 17;
            time += n;
        }
    }
    if(moved >= S)
printf("Yes %d\n",time);
    else
printf("No %d\n",moved);
 
    return 0;
}

0 0
原创粉丝点击