題目鏈結
題目大意:
給你田忌和國王的馬匹每匹所代表的值,值越高代表這個馬越厲害。然後輸出這種情況下的,田忌最多能贏多少銀兩。贏一場可以得200銀兩【注:可以為負值。比如輸了三局,就是-600】
題目思路:
貪心演算法,在這就是分類討論思想:ac**:我們記田忌最快的馬為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的值其實就相當於是將這只之前的輸贏情況返回了,後面全是平局沒有查詢的必要了。
#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場...