2016華為校招上機試題2 洞穴逃生

2021-07-23 09:46:49 字數 2195 閱讀 1450

二、洞穴逃生

描述:精靈王子愛好冒險,在一次探險歷程中,他進入了乙個神秘的山洞。在洞穴深處,精靈王子不小心觸動了洞穴內暗藏的機關,整個洞穴將很快塌陷,精靈王子必須盡快逃離洞穴。精靈王子的跑步速度為17m/s,以這樣的速度可能是無法逃出洞穴的。慶幸的是精靈王子擁有閃爍法術,可在1s內移動60m,不過每次使用閃爍法術都會消耗魔法值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

題目分析:首先看題目中給出的兩種王子逃跑的方式——跑步和魔法。跑步的速度是17m/s,使用閃爍法術的移動速度是60m/s,可見魔法足夠時使用魔法是最優的方式。當魔法不夠時,就要權衡是花時間恢復魔法還是跑步,權衡依賴的兩個因素是距離洞口的距離和剩餘時間,剩餘時間要足夠恢復和使用魔法,且距離洞口要足夠遠(比如如果距離洞口僅僅1m直接跑出去就好了,不用浪費時間恢復魔法),因此,有如下幾種情況:

1)魔法值足夠且時間不為0的情況下,不論距離多遠,直接魔法閃爍;

2)若剩餘魔法值大於等於6,則只需要1s就可恢復到10點魔法,此時若時間大於2秒(因為釋放魔法需要1s),且距離洞口距離大於34m(若小於34m直接花2s跑出去就好了),恢復魔法然後閃爍;

3)若剩餘魔法值大於等於2,則只需要2s就可恢復到10點魔法,此時若時間大於3秒,且距離洞口距離大於51m,恢復魔法然後閃爍;

4)第四種情況比較複雜,若魔法剩餘小於2,則恢復魔法要3s,施放魔法要1s,這種情況還比不上跑步來得快,但是如果後面的距離還足夠長,且時間足夠的話,那麼接下來那一次只需要2s來恢復魔法,這樣(3+1)+(2+1)=7s內可以移動120m,比跑步快,因此當距離大於120m,時間大於7s時,選擇恢復魔法後閃爍;

5)如果不滿足以上四種條件,表明時間不夠恢復魔法或者是距離較近,則選擇跑步前進。

程式**:

#include 

using

namespace

std;

int main()

else

if(t<=0)//沒有時間了

while(s>0 && t>0)

else

if( m>=2 && t-ceil(float((10-m))/4)>=1 && s-17*ceil(float((10-m))/4)>=0 )//如果m>=2,並且距離夠遠、時間足夠——恢復魔法

else

if( s>=120 && t>=7)//如果m<2,並且距離大於等於120m、時間大於等於7s——恢復魔法

else

//魔法不夠、時間也不夠,或者距離洞口很近的情況下

}if(s<=0)

注:**中將第2種和第3種情況合併了。另外一定要注意while迴圈的出口條件,時間和距離一旦有乙個小於等於0,就要停止。以下附上幾組測試用例

10 0 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

華為2016校招上機筆試題第一題

最高分是多少 老師想知道從某某同學當中,分數最高的是多少,現在請你程式設計模擬老師的詢問。當然,老師有時候需要更新某位同學的成績.輸入描述 輸入包括多組測試資料。每組輸入第一行是兩個正整數n和m 0 n 30000,0 m 5000 分別代表學生的數目和操作的數目。學生id編號從1編到n。第二行包含...

華為校招上機題

1.兔子爬洞問題 兔子白天爬出5公尺,晚上又掉下去2公尺。問給定洞的深度,兔子要爬多少天 include includeusing namespace std int str2int const char str int main int argc,char argv temp temp 10 st...

2016校招華為機試題目回憶1

根據指定的分隔符分隔字串,並輸出指定的段。如果指定的段超過分隔的段數,輸出 null 舉例 aaa?bbb?ccc?2 字串為 aaa?bbb?ccc?分隔符為 指定的段為 2 字串分割為 aaa bbb ccc共三段,第2段字串為 bbb 輸入分隔字串長度小於128個字元,指定的段是乙個正整數。輸...