貪心 田忌賽馬題解

2021-09-25 14:35:39 字數 1362 閱讀 6038

田忌準備和齊王賽馬,各自拿出的比賽馬匹數是n個,勝負由每匹馬的速度決定,田忌可 以自由選擇自己的馬和齊王的比賽,田忌贏一次賞金加50,輸一次賞金賠50,田忌賺的 錢最低為0,求田忌最多能賺多少錢?

輸入:

多行測試資料,每行包含乙個整數n和2n個正整數,第乙個n表示比賽馬的數量,之後的n個整數表示齊王馬的速度,此行最後n個整數表示田忌馬的速度。

樣例輸入:

3 2 1 3 2 2 3

3 2 1 3 1 1 3

樣例輸出:

50

0

如果田忌的最快馬快於齊王的最快馬,則兩者比賽一場。這是因為若是田忌的別的馬可能就贏不了,所以兩者比賽。

如果田忌的最快馬慢於齊王的最快馬,則用田忌的最慢馬和齊王的最快馬比賽一場。這是因為所有的馬都贏不了齊王的最快馬,所以用損失最小的,拿最慢的和他比。

若田忌的最快馬和齊王的最快馬一樣快,則比較田忌的最慢馬和齊王的最慢馬。分成兩種情況:

(1)若田忌的最慢馬快於齊王的最慢馬,田忌的最慢馬和齊王的最慢馬比。因為田忌的最慢馬既然能贏乙個就贏乙個,而且齊王的最慢馬肯定也得有個和它比,所以選比齊王的最慢馬快的最慢馬與其比,避免浪費。

(2)否則就拿田忌的最慢馬和齊王的最快馬比。因為反正所有的馬都比田忌的最慢馬快,所以這匹馬必輸,選貢獻最大的比掉齊王的最快馬。

//普通演算法

#include

#include

using

namespace std;

intcmp

(const

int a,

const

int b)

intmain

(void

), b[

100]

=, min1=

0, min2=

0, max1=n-

1, max2=n-

1, res=

0, cnt=0;

for(

int i=

0; i) cin>>a[i]

;for

(int i=

0; i) cin>>b[i]

;sort

(a, a+n, cmp)

;sort

(b, b+n, cmp)

;while

((cnt++

)else

if(b[max2]

)else

if(b[min2]

} cout<}return0;

}

有空再更動態規劃演算法。

貪心 田忌賽馬問題

田忌和齊王各有n匹馬,共有2n組資料,分別給出田忌和齊王n匹馬的速度。他們一共要進行n場比賽,若能分出勝負,則輸的一方要給贏的一方200銀元。若平局,則他們都不用給對方錢。每匹馬都只能用一次。現在要你求出乙個最佳策略,使田忌獲得的錢數最多。並輸出這個最大值。先對田忌和齊王的馬的速度的陣列進行一次從小...

田忌賽馬(貪心)

描述 中國古代的歷史故事 田忌賽馬 是為大家所熟知的。話說齊王和田忌又要賽馬了,他們各派出n匹馬,每場比賽,輸的一方將要給贏的一方200兩 如果是平局的話,雙方都不必拿出錢。現在每匹馬的速度值是固定而且已知的,而齊王出馬也不管田忌的出馬順序。請問田忌該如何安排自己的馬去對抗齊王的馬,才能贏取最多的錢...

田忌賽馬(貪心

給出田忌和齊王各馬的速度,求最優得分 我的貪心策略 當然是錯的 1,用我方在 可以 戰勝 或 比平 對方最慢的馬 的馬 中 最慢的馬 去比 對方最慢的馬 2,直到我方最快的馬也下場了,剩下的馬預設全部戰敗 這種策略明顯是不對的 我方的快馬的貪心策略應該是擊敗能力範圍內對方最快的馬 浪費最小 我方的慢...