Description Alice和Bob都要向同一個商人購買鑽石。商人手中有 N 顆鑽石,他會將它們一顆顆地賣給他們,Alice和Bob通過競價的方式來決定鑽石的歸屬。具體的過程如下:商人首先指定其中一個人開始報價,之後兩人輪流報價,要求是一定要比對方報的價格更高。任何時候,如果一個人不願出價或者出不起價錢時,可以宣布棄權,則對手以最後一次報的價格將鑽石買下。當然,如果兩人都沒錢,商人是不會賣鑽石的。首次報價至少為 1,並且只能報整數的價錢。 Alice和Bob特別愛攀比,因此他們都希望能比對方買到更多的鑽石。Alice和Bob各自帶了 CA 和 CB 的錢用於競拍鑽石。此外,Alice和商人有很不錯的私人關系,因此商人總是會讓Alice先報價。現在請問,在Alice和Bob都用最優策略的情況下,誰能買到更多鑽石?假設雙方都知道對方手中的現金數量,以及商人將要拍賣的鑽石數量 N。 Input 輸入文件包含多組測試數據。 第一行,給出一個整數T,為數據組數。接下來依次給出每組測試數據。 每組數據為三個用空格隔開的整數 N,CA,CB,表示鑽石的數量,以及雙方帶的現金數量。 1 ≤ T ≤ 1000 小數據:0 ≤ N ≤ 10; 0 < CA, CB ≤ 10 大數據:0 ≤ N ≤ 105; 0 < CA, CB ≤ 106 Output 對於每組測試數據,輸出一行"Case #X: Y",其中X表示測試數據編號,Y的取值為{-1, 0, 1},-1表示Alice買到的鑽石會比Bob少,0表示兩人能買到一樣多,1表示Alice能買到更多鑽石。所有數據按讀入順序從1開始編號。 Sample Input 2 4 3 5 7 4 7Sample Output Case #1: 0 Case #2: 1這題做很久不會,表示數學基礎太差,貼一個zhaw(排名10)的代碼:
#include <iostream> #include <string> #include <vector> #include <cctype> #include <cmath> using namespace::std; int main(){ int t; cin>>t; for (int i=1;i<=t;i++){ int result; long int n,ca,cb; cin>>n>>ca>>cb; if (ca+cb<n){ if (ca>cb) result=1; if (ca==cb) result=0; if (ca<cb) result=-1;} else if (n%2==0){ int k=n/2; if (cb>=(floor(ca/k)+1)*(k+1)) result=-1; else if (cb>=(floor(ca/(k+1))+1)*k) result=0; else result=1; } else{ int k=(n-1)/2; if (cb>=(floor(ca/(k+1))+1)*(k+1)) result=-1; else result=1; } cout<<"Case #"<<i<<": "<<result<<endl; } return 0; }