P1650 田忌賽馬(貪心)

2021-09-25 16:40:27 字數 1708 閱讀 8167

田忌很沮喪,直到他遇到了著名的軍師――孫臏。田忌採用了孫臏的計策之後,三場比賽下來,輕鬆而優雅地贏了齊王200銀幣。這實在是個很簡單的計策。由於齊王總是先出最好的馬,再出次好的,所以田忌用常規馬對齊王的超級馬,用自己的超級馬對齊王的上級馬,用自己的上級馬對齊王的常規馬,以兩勝一負的戰績贏得200銀幣。實在很簡單。

如果不止三匹馬怎麼辦?這個問題很顯然可以轉化成乙個二分圖最佳匹配的問題。把田忌的馬放左邊,把齊王的馬放右邊。田忌的馬a和齊王的b之間,如果田忌的馬勝,則連一條權為200的邊;如果平局,則連一條權為0的邊;如果輸,則連一條權為-200的邊……如果你不會求最佳匹配,用最小費用最大流也可以啊。 然而,賽馬問題是一種特殊的二分圖最佳匹配的問題,上面的演算法過於先進了,簡直是殺雞用牛刀。現在,就請你設計乙個簡單的演算法解決這個問題。

輸入格式

第一行乙個整數n,表示他們各有幾匹馬(兩人擁有的馬的數目相同)。第二行n個整數,每個整數都代表田忌的某匹馬的速度值(0 <= 速度值<= 100)。第三行n個整數,描述齊王的馬的速度值。兩馬相遇,根據速度值的大小就可以知道哪匹馬會勝出。如果速度值相同,則和局,誰也不拿錢。

【資料規模】

對於20%的資料,1<=n<=65;

對於40%的資料,1<=n<=250;

對於100%的資料,1<=n<=2000。

輸出格式

僅一行,乙個整數,表示田忌最大能得到多少銀幣。

輸入輸出樣例

輸入 #1 複製

3

92 83 71

95 87 74

輸出 #1 複製

200
ac_code:

#include

using namespace std;

const

int maxn =

2e3+10;

int a[maxn]

;int b[maxn]

;int

main()

for(

int i =

0; i < n; i++

)sort

(a,a+n)

;sort

(b,b+n)

;int i =

0,j = n-1;

int t =

0,k = n-

1,cnt =0;

//cnt記錄比的次數

int x =

0, y =0;

//x--〉vectory,y--->defeat

while

(cnt < n)

else

if(cnt == n)

break;if

(a[i]

< b[k]

) y++

;//此時小的也比不過誰了,所以用小的來消耗大的

i++; k--

; cnt++;}

if( j <

0|| k <0)

break

;//防越界吶!!

}//cout("%d\n"

,(x-y)

*200);

}return0;

}/*32 4 4

2 3 3

32 3 5

1 2 5

32 3 5

2 2 5

*/

P1650 田忌賽馬

我在考試的時候看到了這道題,在一瞬間就蒙逼了,這是什麼題?請原諒我 250 250 250 的智商 於是懵裡懵懂的打了個d dd 電 f ff 風 s ss 扇 結果連樣例都沒有過。畢竟才學搜尋沒多久嘛,也就兩年 再一看,看出了田忌賽馬的味道,原來是這樣 立刻打了個貪心信心滿滿的交上去。includ...

P1650 田忌賽馬

n 齊王和田忌各有n nn匹馬,每匹馬都有乙個強度值ai bia i b i ai bi 每次齊王和田忌要從自己的n nn匹馬中選乙個上去比賽,其中齊王總是讓馬從強到弱上 若兩匹馬強度不同,則強度高的那一方將獲得200 20020 0銀幣,若強度相同,兩方都獲得不了盈利 試著替田忌安排一種讓馬上去比...

P1650 田忌賽馬

我在考試的時候看到了這道題,在一瞬間就蒙逼了,這是什麼題?請原諒我 250 的智商 於是懵裡懵懂的打了個 d 電 f 風 s 扇 結果連樣例都沒有過。畢竟才學搜尋沒多久嘛,也就兩年 再一看,看出了田忌賽馬的味道,原來是這樣 立刻打了個貪心信心滿滿的交上去。includeusing namespace...