田忌準備和齊王賽馬,各自拿出的比賽馬匹數是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,直到我方最快的馬也下場了,剩下的馬預設全部戰敗 這種策略明顯是不對的 我方的快馬的貪心策略應該是擊敗能力範圍內對方最快的馬 浪費最小 我方的慢...