題目描述
相信大家都聽說過「是男人就下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 輸入描述 多組輸入,每行輸入乙個字母。輸出描述 針對每組輸入,輸出...