编程之美 初赛第一场 竞价

来源:互联网 发布:java split . 编辑:程序博客网 时间:2024/04/30 12:49

描述

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;}


 


 

原创粉丝点击