演算法競賽學習筆記 田忌賽馬(貪心法)

2021-08-09 00:27:01 字數 1242 閱讀 7281

題目描述:田忌和齊王賽馬,勝一場可獲得200金,負一場損失200金,平局無得無失。現在給出馬的數量,田忌的每匹馬的速度和齊王每匹馬的速度,求出田忌最多可以贏得多少金。

輸入輸出:包含多組資料,每組資料的第一行為乙個正整數n(n<=1000),表示每一方有多少匹馬,第二行為n個整數,表示田忌每匹馬的速度,第三行n個整數表示齊王每匹馬的速度。當n為0時,表示輸入資料結束。每組樣例輸出一行,給出田忌可以贏得的具體金數。

輸入樣例:

92 83 71

95 87 74

20 20

20 20

20 19

22 18

輸出樣例:

題目分析:

策略是充分利用每一匹馬的戰鬥力,若己方的最好馬優於對方的最好馬,則使己方的最好馬戰勝對方的最好馬;若己方的最好馬劣於對方的最好馬,則必定要輸一次,用己方最劣的一匹馬消耗對方的最好馬,從而使己方的最好馬可以對戰對方下乙個等級的馬,增大贏的概率。當雙方的最好馬實力相當時,為了盡可能多贏,檢查雙方最劣馬的實力,若己方最劣馬強於對方,則先用己方最劣馬戰勝對方最劣馬,保證贏一局,若己方最劣馬弱於對方,則該匹馬注定要輸,用其消耗對方最高戰鬥力。若雙方最劣馬實力相當,仍用己方最劣馬消耗對方最好馬,當只看最優和最劣兩組資料時,這樣最壞的結果是平局,然而可以增大中間資料贏的概率(因為己方的最優馬得以對陣對方下一等級的馬,且對方下一等級的馬戰鬥力一定小於等於它)。

**實現:

#include

#include

#include

using namespace std;

int main()

for(i=0;i

sort(tian.begin(),tian.end());

sort(king.begin(),king.end());

//for(i=0;i   //

tworst=0;kworst=0;

tbest=n-1;kbest=n-1;

sum=0;

while(tworst<=tbest)

else if(tian[tbest]

else if(tian[tbest]==king[kbest]&&tian[tworst]>king[kworst])

else if(tian[tbest]==king[kbest]&&tian[tworst]<=king[kworst])

}cout<   tian.clear();

king.clear();

}return 0;

田忌賽馬貪心演算法 田忌賽馬問題 貪心演算法

關於輸入 輸入包含多組測試資料.每組測試資料的第一行是乙個整數n 1 n 1000 表示田忌和齊王都擁有n匹馬。接下來一行是n個整數,表示田忌的馬的速度,下一行也是n個整數,表示齊王的馬的速度。輸入的最後以乙個0表示結束。關於輸出 對每組資料,如果田忌能贏則輸出 win 如果田忌能輸則輸出 lose...

田忌賽馬貪心演算法 貪心演算法 田忌賽馬問題

題目描述 你一定聽過田忌賽馬的故事吧?如果3匹馬變成1000匹,齊王仍然讓他的馬按從優到劣的順序出賽,田忌可以按任意順序選擇他的賽馬出賽。贏一局,田忌可以得到200兩銀子,輸一局,田忌就要輸掉200兩銀子,平局的話不輸不贏。請問田忌最多能贏多少銀子?關於輸入 輸入包含多組測試資料.每組測試資料的第一...

田忌賽馬貪心演算法 貪心演算法解決田忌賽馬

田忌賽馬 對策問題 教學目標 1 通過簡單的事例,使學生初步體會對策論在解決.梁錦美有無課件 上課時間 有 12 月 15 日 1 田忌賽馬中的數學問題 課時.同學們,你聽過 田忌賽馬 的故事嗎?第一次賽馬 上 上 中 中 下 田忌 下齊.上課周次 十六 有無課件 上課時間 有 12 月 15 日 ...