hdu1052(貪心演算法解決田忌賽馬)

2021-10-02 20:08:42 字數 1602 閱讀 4576

題目鏈結

題目大意:

給你田忌和國王的馬匹每匹所代表的值,值越高代表這個馬越厲害。然後輸出這種情況下的,田忌最多能贏多少銀兩。贏一場可以得200銀兩【注:可以為負值。比如輸了三局,就是-600

題目思路:

貪心演算法,在這就是分類討論思想:

我們記田忌最快的馬為qt,最慢的馬為st

記國王最快的馬為qk,最慢的馬為sk

那麼可以分為以下情況:

①st>sk,就直接比,算贏一場

②stk,就讓田忌的最慢的馬與王最快的馬相比,算輸一場

③st==sk,我們需要再往下討論如下

③-①:qt>qk,直接比,記贏一場

③-②:qt

<=qk,需要判斷一下,

③-②-①:如果王的最快的馬比田忌最慢的馬快,就記輸一次

③-②-②:如果王的最快的馬比田忌最慢的馬相等,其實就相當於是場上所剩下的所有的馬值都是一樣的。因為我們這個情況是在st==sk和qt

<=qk條件下的,如果qk==st,那麼只有一種情況就是st==sk==qk==qt。但是!!!!我們不能直接將其return 0 掉,因為st、sk、qk、qt這四個是動態變化的有可能是最後中間出現了這種相等的情況,如果直接return0的話,之前找的就相當於是白找了,看下面的例子

所以滿足這種③-②-②情況的可能有:

377 77 77

77 77 77

如果單單只是上面這種一開始就進入這個情況,我們確實可以直接return 0掉

然而,也有可能是以下的情況:

476 77 77 77

77 77 77 78

這樣子的話直接return0掉的話,就會導致答案錯誤,正確答案其實是-200,也就是說之前找的情況直接被覆蓋了。

所以碰到這種情況我們處理方式就是,直接return win的值回來【注:win的值記錄的是田忌累計的輸贏情況】。這時候return win的值其實就相當於是將這只之前的輸贏情況返回了,後面全是平局沒有查詢的必要了。

ac**:

#include

#include

#include

using namespace std;

int tian[

1005];

int king[

1005];

int n;

//馬匹數

intrace()

else

if(tian[thead]

)else

else

else}}

}return win;

}int

main()

for(

int i =

0;i < n;i++

)for

(int j =

0;j < n;j++

) ans =

race()

; cout<200<}return0;

}

田忌賽馬 貪心演算法 HDU1052

田忌賽馬的故事大家都應該聽過吧。田忌和齊王賽馬,有優良差三種馬,每一種馬齊王都比田忌要好,所以齊王總是贏,田忌輸一次就要給齊王200銀幣,田忌輸的很慘於是去找孫臏幫忙。孫臏就讓他用最差的馬去和齊王最好的馬比,然後用優秀的馬去贏齊王差的馬。題目不過是把三頭馬變成了1000頭馬,齊王還是按馬的優劣來安排...

hdu1052 田忌賽馬 貪心

錯誤 include 田忌賽馬,錯誤版 include include 思路 用田忌最快的馬與齊王最快的馬比較,1.若能贏就贏 2.若贏不了,就用最差的馬拖齊王最好的馬入水 3.若打平 要判斷是否在最好一匹馬,若是,則打平,若不是,則用最差的一匹馬拖它下水,雖然輸了這次,但下次有機會贏回。看似無差別...

HDU 1052 田忌賽馬 貪心

題意是田忌賽馬的背景,雙方各有n匹馬,下面兩行分別是田忌和齊王每匹馬的速度,要求輸出田忌最大的淨勝場數 每場的賭金200。開始的時候想對雙方的馬匹速度排序,然後比較最快的馬,能勝則勝,否則用最慢的馬去消耗對方,但這樣存在問題 1 2 3 對 1 3 3的時候,會變成1 3,2 3,3 1,淨勝 1場...