hdu4111 成都現場賽A題

2021-06-01 17:25:09 字數 754 閱讀 1946

/*

題意:有n堆石子,每堆石子有乙個數目,現有兩個人博弈,每個人每次可以進行兩個操作中的乙個:

1、從某堆拿掉乙個石子(若某堆石子為0了,那麼這堆就不存在了);2、合併兩堆石子

沒有操作的就輸。問是哪個贏

思想:如果每堆石子數都大於1,那麼最後結果肯定相當於所有的堆合併成一堆後,然後再乙個乙個拿掉的結果。

因為如果那種情況是贏的人一定會不斷合併堆來確保他是贏的。又因為所有堆的石子數都大於1,所以輸的人無法阻止他這麼幹。

而有些堆石子數等於1的話,就不一定是所有的合併的結果了,因為輸的人可以直接把等於1的堆去掉,就破壞了結構

(合併相當於2步,去掉只需要1步)。

dp[i][j]表示有i個石子數為1的堆數,其它堆合併再取完的步數為j。若值為1則先取者勝,為0為先取者輸

*/#include#include#include#includeusing namespace std;

int dp[55][55000];

int a[55];

int dp(int a,int b)

int main()

if(k) k--;//合併的次數多算了一次

dp(j,k);

printf("case #%d: ",test++);

if(dp[j][k]) printf("alice\n");

else printf("bob\n");

} return 0;

}

hdu 4288 2012成都網路賽

線段樹學的遠遠不夠啊,網路賽的時候一直不知道怎麼做,後來看了大神報告,才學了一下。線段樹每個節點 記錄 sum 0.5 即位置mod 5 的5種結果的數對應的和。cnt記錄區間有多少個數。更新的時候 只要把對應子區間的sum i 加起來就可以了 include includeusing namesp...

11年成都網路賽

今天把去年成都的網路賽做了一下,去年是一題不會哇,現在也挺吃力,還有幾題不會,有空再來看 attack 樹狀陣列,這題樹狀陣列節點n記錄的是wall n 和wall n 1 被炮擊的差 include include include includeusing namespace std define...

11年成都網路賽

今天把去年成都的網路賽做了一下,去年是一題不會哇,現在也挺吃力,還有幾題不會,有空再來看 attack 樹狀陣列,這題樹狀陣列節點n記錄的是wall n 和wall n 1 被炮擊的差 include include include includeusing namespace std define...