P1650 田忌賽馬

2021-10-11 01:31:31 字數 1864 閱讀 7164

n 齊王和田忌各有n

nn匹馬,每匹馬都有乙個強度值ai/

bia_i/b_i

ai​/bi

​每次齊王和田忌要從自己的n

nn匹馬中選乙個上去比賽,其中齊王總是讓馬從強到弱上

若兩匹馬強度不同,則強度高的那一方將獲得200

20020

0銀幣,若強度相同,兩方都獲得不了盈利

試著替田忌安排一種讓馬上去比賽的順序,使得最後盈利最大

資料範圍:n≤2

×103

n\leq 2\times 10^3

n≤2×103so

luti

onsolution

soluti

on看到這個資料範圍,dpdp

dp很好想乙個顯然(如果你看過這個故事的話)結論是田忌總是讓最弱的或者最強的一匹馬上去

所以可以設fi,

jf_fi,j

​表示安排了i

ii匹馬,其中從按照從強到弱田忌選了j

jj匹馬(也就是從弱到強選了i

ii匹馬)

然後考慮每次選弱還是選強即可,時間複雜度: o(n

2)o(n^2)

o(n2)

但是有一種更好的貪心做法

顯然如果單純按照故事來說的話,我們總是讓最弱的馬去送人頭,使得讓我們後面的馬盡可能的勝利

但這樣真的是完全正確的貪心嗎?

顯然不是

例如2 3 4 5

1 2 3 4

按照上述貪心得出來的答案是0,實際上我們每場比賽都可以贏(按順序比就行了)

也就是說,我們還需要考慮我方最弱的能否完勝(注意是完勝,平手的話另外考慮

如果最弱的不能完勝,我們是直接讓它去送人頭嗎?

並不一定,因為加入我方最強的本來就可以吊打對方最強的(注意是吊打,如果平手的話讓最弱的送人頭一定不會更劣),那就沒有必要讓最弱的送人頭

也就是說,當且僅當我方最弱的無法吊打對方最弱的且我方最強的無法吊打敵方最強的時,讓最弱的去送人頭(這樣一定不會更劣)

考慮完這些就好了,注意特判送人頭不一定送得到(可能對方最強的還沒你這邊最弱的強2333)

排個序依次處理就好了,時間複雜度o(n

log⁡n)

o(n\log n)

o(nlogn)

,**採用的也是這種方法

c od

ecode

code

#include

#include

#include

#include

#define ll long long

#define n 100010

using

namespace std;

int n,a[n]

,b[n]

;inline ll read()

inline

intwork

(int a,

int b)

signed

main()

P1650 田忌賽馬

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

P1650 田忌賽馬

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

題解 P1650 田忌賽馬

與古代田忌的應對方法差不多,現在我們任然可以用貪心的思路解答。1.田忌的馬甚至比齊王的馬快,那麼,直接將兩人最快的馬進行比賽,達到最優 2.田忌最快的馬比齊王最快的馬要慢,則與古代田忌的方案相同,用田忌最慢的馬消耗掉齊王最快的馬 3.齊王最快的馬與田忌最快的馬速度相當,又可以分成2種情況 程式 in...