「奔跑吧,牛客「 是男人就下100層

2021-07-03 20:26:25 字數 2280 閱讀 8633

題目描述

相信大家都聽說過「是男人就下100層」系列遊戲,遊戲中包括多個長度和高度各不相同的平台,地面是最低的平台,高度為零,長度無限。

乙個男人在開始的時候從高於所有平台的某處開始下落,它的下落速度始終為1公尺/秒。當他落到某個平台上時,遊戲者選擇讓他向左或向右跑,跑動的速度也是1公尺/秒。當他跑到平台的邊緣時會繼續下落。要求每次下落的高度不能超過max公尺,不然就會摔死,遊戲也會結束。

請幫忙設計乙個程式,計算最快到達地面所用的時間。

輸入描述:

輸入包含多組資料。

每組測試資料的第一行是四個整數n、x、y、max,用空格分隔。n是平台的數目(不包括地面),x和y是遊戲開始時男人所在位置的座標,max是一次下落的最大高度。

緊接著有n行,每行描述乙個平台的資訊,包括三個整數,x1[i],x2[i]和h[i]。h[i]表示平台的高度,x1[i]和x2[i]表示平台左右端點的橫座標。

1 ≤ n ≤ 1000;-20000 ≤ x, x1[i], x2[i] ≤ 20000;1 ≤ h[i] < y ≤ 20000(1≤i≤n)。所有座標的單位都是公尺。

平台的厚度忽略不計,如果恰好落在某個平台的邊緣,被視為落在平台上。所有的平台均不重疊或相連。測試資料保證問題一定有解。

輸出描述:

對應每一組輸入,輸出乙個整數,為到達地面最早的時間。

輸入例子:

3 8 17 20

0 10 8

0 10 13

4 14 3

輸出例子:

23思路:用left_time,right_time記錄到達平台左右端點時間的最小值。從高到低遍歷每乙個平台,判斷從這個平台的左右端點在下落max內,是否會降落於其他平台上。如果會, 就更新降落的平台的左右端點時間。這樣遍歷的好處是,當我們考慮平台a時,他的左右端點的時間值,必然是所有到達平台a的可能路徑的最小時間。

#include #include #include #include #include using namespace std;

struct platform;

bool cmp(platform a, platform b)

else

}int main()

sort(vec.begin(), vec.end(), cmp);//對容器vector的平台做從高到低的排序

int time = int_max;//記錄到達地面的最短時間

//當yif (y <= max)

//j==n,表示主角直接落於地面上,那就必為最小值,直接輸出即可。

if (j == n)

}//經過上面的判斷,主角不會直接落於地面,那麼,就找出主角會落於哪個平台上,並更新到達此平台的左右端點的時間值

int i = 0;

//在下落高度小於max內尋找平台

while (y - vec[i].height <= max)

else

}//接下來,就是從第乙個降落的平台依次遍歷

while (i < vec.size())

if (vec[j].right_time > vec[j].right - vec[i].left + vec[i].height - vec[j].height + vec[i].left_time)

break;

}else}}

//這是從平台i的右端點降落,找平台

j = i + 1;

if (vec[i].right_time != int_max)

if (vec[j].right_time > vec[j].right - vec[i].right + vec[i].height - vec[j].height + vec[i].right_time)

break;

}else}}

//接下來是分別分析平台左右端點,判斷從平台的左右端點是否會直接落於地面,如果會,則計算出時間與time對比,並記錄小的值。

if (vec[i].left_time!=int_max&&vec[i].height <= max)

}if (j == n)}}

if (vec[i].right_time != int_max&&vec[i].height <= max)

}if (j == n)}}

i++;

}cout << time << endl;

}return

0;}

上述 **,有些地方可以憂化,如從平台左端點如果會降落到另一平台,那必然就不會落於地面,就無需再去判斷一次了。我小偷個懶,就不改了。

如果有更好的方法,望不吝賜教。

當用牛客刷題是最好別用靜態變數來計數或存陣列

例如二叉搜尋樹的第k個結點這個題目。struct treenode class solution void f treenode root,vector vec 錯誤解法,由於沒進行一次測試有不同測試資料,每測試一條資料,並不會清空靜態變數,導致解題用到的vec變數一直是增加元素的。本意對每乙個資料...

牛客程式語言練習賽第二場 A判斷是母音還是子音

判斷是母音還是子音題目描述 kiki開始學習英文本母,bobo老師告訴他,有五個字母a a e e i i o o u u 稱為母音,其他所有字母稱為子音,請幫他編寫程式判斷輸入的字母是母音 vowel 還是子音 consonant 輸入描述 多組輸入,每行輸入乙個字母。輸出描述 針對每組輸入,輸出...