描述
Alice和Bob都要向同一个商人购买钻石。商人手中有 N 颗钻石,他会将它们一颗颗地卖给他们,Alice和Bob通过竞价的方式来决定钻石的归属。具体的过程如下:商人首先指定其中一个人开始报价,之后两人轮流报价,要求是一定要比对方报的价格更高。任何时候,如果一个人不愿出价或者出不起价钱时,可以宣布弃权,则对手以最后一次报的价格将钻石买下。当然,如果两人都没钱,商人是不会卖钻石的。首次报价至少为 1,并且只能报整数的价钱。
Alice和Bob特别爱攀比,因此他们都希望能比对方买到更多的钻石。Alice和Bob各自带了 CA 和 CB 的钱用于竞拍钻石。此外,Alice和商人有很不错的私人关系,因此商人总是会让Alice先报价。现在请问,在Alice和Bob都用最优策略的情况下,谁能买到更多钻石?假设双方都知道对方手中的现金数量,以及商人将要拍卖的钻石数量 N。
输入
输入文件包含多组测试数据。
第一行,给出一个整数T,为数据组数。接下来依次给出每组测试数据。
每组数据为三个用空格隔开的整数 N,CA,CB,表示钻石的数量,以及双方带的现金数量。
输出
对于每组测试数据,输出一行”Case #X: Y”,其中X表示测试数据编号,Y的取值为{-1, 0, 1},-1表示Alice买到的钻石会比Bob少,0表示两人能买到一样多,1表示Alice能买到更多钻石。所有数据按读入顺序从1开始编号。
数据范围
1 ≤ T ≤ 1000
小数据:0 ≤ N ≤ 10; 0 < CA, CB ≤ 10
大数据:0 ≤ N ≤ 105; 0 < CA, CB ≤ 106
这道题很有意思的~
之前都以为是博弈,结果木有做出来啊~
完了看看别人的解题报告,才发现啊。。。应该算是一道思维题了
首先求出如果两个人平分宝石,那么最多会得到n;
算出以A,B的钱数,得到n个宝石平均价值va,vb;
如果A按B的平均价值vb,可以得到的宝石数na;
if(na>n)那么a赢;
同理;if(nb>n)那么b赢;
如果前两者都不成立,那么a与b为平手。。。
像这样,转换思维,并不需要弄清中间A,B的过程,只要知道结果即可;
代码:
#include<iostream>
using namespace std;
int main(){
int m;
cin>>m;
int times=0;
while(m--){
times++;
int n,a,b;
cin>>n>>a>>b;
cout<<"Case #"<<times<<": ";
int n1=n;
n=(n+1)/2;
int av=a/n;
int bget=b/(av+1);
if(2*bget>n1){
cout<<"-1"<<endl;
continue;
}
int bv=b/n;
int aget=a/bv;
if(2*aget>n1){
cout<<"1"<<endl;
continue;
}
cout<<"0"<<endl;
}
return 0;
}