田忌很沮喪,直到他遇到了著名的軍師――孫臏。田忌採用了孫臏的計策之後,三場比賽下來,輕鬆而優雅地贏了齊王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...