【題解】田忌賽馬(貪心)
阿新 • • 發佈:2022-01-06
典型貪心,可惜我太菜想好久
和最小速度的位置
題目描述
賽馬是一古老的遊戲,早在公元前四世紀的中國,處在諸侯割據的狀態,歷史上稱為 “戰國時期”。在魏國作官的孫臏,因為受到同僚龐涓的迫害,被齊國使臣救出後,到達齊國國都。
賽馬是當時最受齊國貴族歡迎的娛樂專案。上至國王,下到大臣,常常以賽馬取樂,並以重金賭輸贏。田忌多次與國王及其他大臣賭輸贏,屢賭屢輸。一天他賽馬又輸了,回家後悶悶不樂。孫臏安慰他說:“下次有機會帶我到馬場看看,也許我能幫你。”
孫臏仔細觀察後發現,田忌的馬和其他人的馬相差並不遠,只是策略運用不當,以致失敗。
比賽前田忌按照孫臏的主意,用上等馬鞍將下等馬裝飾起來,冒充上等馬,與齊王的上等馬比賽。第二場比賽,還是按照孫臏的安排,田忌用自己的上等馬與國王的中等馬比賽,在一片喝彩中,只見田忌的馬竟然衝到齊王的馬前面,贏了第二場。關鍵的第三場,田忌的中等馬和國王的下等馬比賽,田忌的馬又一次衝到國王的馬前面,結果二比一,田忌贏了國王。
不過多久,國王又找到田忌賽馬,這次國王和田忌都準備了 n 匹馬,每匹馬都有恆定的速度,所以速度大的馬一定比速度小的馬先到終點(沒有意外!!)。每場比賽國王會先出一匹沒有出戰過的馬,然後田忌再選擇一匹沒有出戰過的馬進行對戰。這次田忌找你幫忙,你最多能幫田忌贏得幾場比賽(平局不算贏)。
輸入格式
輸入資料包含三行。
第一行輸入 n(1 <= N <= 1000),表示馬的數量。
第二行有 n 個整數,即田忌的 n 匹馬的速度。
第三行有 n 個整數,即國王的 n 匹馬的速度。
馬的速度大於 0 小於等於 1000。
輸出格式
輸出通過你的精心安排,最多能贏得多少場比賽。
分析及程式碼實現
首先將兩個存放速度的陣列排列;
然後分別記錄下當前陣列中最大速度的位置
接下來進行分析:
- 如果田忌最快的馬比齊王最快的馬快,就比,則勝場加一,再將這兩匹馬從當前陣列中去除
- 如果田忌最快的馬比齊王最快的馬慢,就用田忌最慢的馬 V S齊王最快的馬,此時雖然不能勝利,但是可以用最大的價效比消耗齊王,再將這兩匹馬從當前陣列中去除
- 如果田忌最快的馬和齊王最快的馬速度一樣,那就觀察田忌最慢的馬與齊王最慢的馬之間的關係:
- 田忌最慢 > 齊王最慢,就比,則勝場加一,再將這兩匹馬從當前陣列中去除
- 田忌最慢 <= 齊王最慢,就用田忌最慢 VS 齊王最快的馬,再將這兩匹馬從當前陣列中去除
c++程式碼實現
#include <iostream> #include <algorithm> using namespace std; const int N = 1010; int tian[N], wang[N]; int main() { int n, cnt = 0; cin >> n; for (int i = 0; i < n; i++) scanf("%d", &tian[i]); for (int i = 0; i < n; i++) scanf("%d", &wang[i]); sort(tian, tian + n);//升序 sort(wang, wang + n); int lt = 0, lw = 0, rt = n - 1, rw = n - 1; for (int i = 0; i < n;i++){ if (tian[rt] > wang[rw]) cnt++, rt--, rw--; else if(tian[rt] < wang[rw]) lt++, rw--; else{ if(tian[lt]>wang[lw]) cnt++, lt++, lw++; else lt++, rw--; } } cout << cnt << endl; return 0; }