2016華為学校招上機試験問題2——洞窟脱出

5439 ワード

二、洞窟の脱出描写:精霊王子は冒険が好きで、探検の過程の中で、彼は神秘的な洞窟に入った.洞窟の奥で、精霊王子はうっかり洞窟内の隠れた機関に触れ、洞窟全体がすぐに陥没し、精霊王子はできるだけ早く洞窟から逃げなければならない.精霊王子のランニングスピードは17 m/sで、このようなスピードでは洞窟から逃げられないかもしれません.幸いなことに精霊王子は点滅法術を持っており、1 s以内に60 m移動できるが、点滅法術を使うたびに魔法値10点を消費する.精霊王子の魔法値回復速度は4時/sで、その場で休憩しているときだけ回復します.現在では精霊王子の魔法の初期値Mが知られており、彼の洞窟の中の位置と洞窟の出口との間の距離S、洞窟が陥没する時間T.あなたの任務は、精霊王子が最短時間で洞窟から逃げる方法を計算するプログラムを書くことです.脱出できれば「Yes」を出力し、脱出にかかる最短時間を出力する.逃げられなければ、「No」を出力し、精霊王子が残りの時間で歩ける最も遠い距離を出力します.アルファベットの大文字と小文字に注意してください.注意:精霊王子のランニング、点滅、休憩活動は秒(s)単位です.各アクティビティの持続時間は整数秒です.距離の単位はメートル(m)です.注意:M、S、Tはいずれも0以上の整数です.入力によって値の合法性を保証し、受験生は検査しない.注意:入力したSが0の場合、説明自体はすでに出口にあり、出力は:Yes 0入力したTが0(Sが0ではない)の場合、説明には時間がありません.出力は、No 0入力:M S T出力:「Yes洞窟から脱出するのにかかる最短時間」または「No洞窟が陥没するまで逃げられる最遠距離」サンプル入力:10 50 5サンプル出力:Yes 1
テーマ分析:まずテーマの中で与えられた2つの王子が逃げる方法--ランニングと魔法を見ます.走る速度は17 m/s、点滅法術を使う移動速度は60 m/sで、魔法が十分な場合に魔法を使うのが最適な方法であることがわかります.魔法が足りない場合は、魔法を回復するのに時間がかかるか走るのかを見極める必要があります.1)魔法値が十分で時間が0でない場合、距離にかかわらず直接魔法が点滅する場合.2)残りの魔法の値が6以上であれば、1 sで10点まで回復できる.この場合、2秒以上(魔法を解放するのに1 sかかるため)、穴から34 m以上(34 m未満で直接2 sで走ればよい)であれば、回復魔法は点滅する.3)残りの魔法の値が2以上であれば、2 sで10点魔法に戻ることができ、この時、時間が3秒以上で、穴からの距離が51 m以上であれば、魔法を回復して点滅する.4)第4のケースは複雑で、魔法の残りが2未満であれば回復魔法は3 s、魔法の適用は1 sという状況で、走るよりも速くはないが、後の距離が十分長く、時間が十分であれば、次の回は2 sで回復するだけで、(3+1)+(2+1)=7 sで120 m移動でき、走るよりも速く、従って、距離が120 mより大きく、時間が7 sより大きい場合、回復魔法を選択して点滅する.5)上記の4つの条件を満たさない場合、時間が魔法を回復していないか、距離が近いことを示す場合は、ランニングを選択して前進する.
プログラムコード:
#include 
using namespace std;
int main()
{
    int S,T,M;

    cin>>M>>S>>T;

    int s0 = S,t0 = T,m0 = M;

    if(S<=0)//        
    {
        cout<<"Yes "<<0;
        return 0;
    }
    else if(T<=0)//     
    {
        cout<<"No "<<0;
        return 0;
    }

    while(S>0 && T>0)
    {
        if( M>=10)//     ——    
        {
            T--;
            M = M - 10;
            S = S - 60;
            continue;
        }
        else if( M>=2 && T-ceil(float((10-M))/4)>=1 && S-17*ceil(float((10-M))/4)>=0 )//  M>=2,      、    ——    
        {
            int t = ceil(float((10-M))/4);
            T = T - t;
            M = M + 4*t;
            continue;
        }
        else if( S>=120 && T>=7)//  M<2,        120m、      7s——    
        {
            T = T - 3;
            M = M + 12;
            continue;
        }
        else//    、     ,            
        {
            S = S - 17;
            T--;
        }
    }

    if(S<=0)
    {
        cout<<"Yes "<else
    {
        cout<<"N0 "<return 0;
}

注意:コードには、2番目と3番目のケースが統合されています.またwhileサイクルの出口条件に注意し,時間と距離が0以下になると停止する.以下に試験用例10 0 Yes 0をいくつか添付する
10 1 0 No 0
3 50 3 Yes 3
1 60 4 Yes 4
1 77 4 No 68
3 77 4 Yes 4
1 120 8 Yes 7
1 137 8 Yes 8
1 147 8 No 137