1. 程式人生 > >題解報告:hdu 2149 Public Sale(巴什博弈)

題解報告:hdu 2149 Public Sale(巴什博弈)

end 選擇 bsp 數據 scrip 不想 由於 mes sam

題目鏈接:acm.hdu.edu.cn/showproblem.php?pid=2149

Problem Description 雖然不想,但是現實總歸是現實,Lele始終沒有逃過退學的命運,因為他沒有拿到獎學金。現在等待他的,就是像FarmJohn一樣的農田生涯。要種田得有田才行,Lele聽說街上正在舉行一場別開生面的拍賣會,拍賣的物品正好就是一塊20畝的田地。於是,Lele帶上他的全部積蓄,沖往拍賣會。後來發現,整個拍賣會只有Lele和他的死對頭Yueyue。通過打聽,Lele知道這場拍賣的規則是這樣的:剛開始底價為0,兩個人輪流開始加價,不過每次加價的幅度要在1~N之間,當價格大於或等於田地的成本價 M 時,主辦方就把這塊田地賣給這次叫價的人。Lele和Yueyue雖然考試不行,但是對拍賣卻十分精通,而且他們兩個人都十分想得到這塊田地。所以他們每次都是選對自己最有利的方式進行加價。由於Lele字典序比Yueyue靠前,所以每次都是由Lele先開始加價,請問,第一次加價的時候,Lele要出多少才能保證自己買得到這塊地呢? Input 本題目包含多組測試,請處理到文件結束(EOF)。每組測試占一行。每組測試包含兩個整數M和N(含義見題目描述,0<N,M<1100) Output 對於每組數據,在一行裏按遞增的順序輸出Lele第一次可以加的價。兩個數據之間用空格隔開。
如果Lele在第一次無論如何出價都無法買到這塊土地,就輸出"none"。 Sample Input 4 2 3 2 3 5 Sample Output 1 none 3 4 5 解題思路:巴什博弈簡單題。經分析可知,結果可以分三種情況:①當n>=m,即先手第一次可以加的價格大於等於田地的成本價,此時可以加的價格依次為m~n;②當m%(n+1)==0時,後手必贏,即此時輸出“none”;③當n<m且m%(n+1)!=0時,此時可以只能加m%(n+1)這個價格才能保證贏。
AC代碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,m;
 6     while(cin>>m>>n){
 7         int mod = m%(n+1);
 8         if(m<=n)
 9             for(int i=m;i<=n;++i)
10                 cout<<i<<(i==n?"\n":" ");//表示第一次可以選擇的價格
11
else if(mod==0)cout<<"none"<<endl;//先手必輸,後手必贏 12 else cout<<mod<<endl;//只能選mod加價才能贏(m>n這種情況) 13 } 14 return 0; 15 }

題解報告:hdu 2149 Public Sale(巴什博弈)