Brave Game

来源:互联网 发布:网络安全设备巡检表 编辑:程序博客网 时间:2024/04/27 18:56

     http://acm.hdu.edu.cn/showproblem.php?pid=1846

博弈论中的第一讲:

假如对方是先手,一共有n石子,一次最多拿m个。如果我想取胜,那么在这个轮流拿石子的过程中我必须看对方每次拿多少以计算我每次应该拿多少,这样预期结果是我赢;当然,对方也是这样想的。这也是题目的隐含条件。

 当然我想赢,即对方最后拿完石子后 剩余s个石子(s<m),这样剩下的就够归我了。退一步说,我最后第二次拿完剩L(m<L<2m)。

那么如何计算以保证最后几步和我预期的一样呢? 现在是对方先拿,然后我观察对方的拿法,再应对,然后对方再拿,我再应对,以此类推。对方第一次拿的石子任意,但要小于等于m,假设此后我保证每次对方拿的石子和我拿的石子相加为一固定值,那么n个石子里面被分成若干个该固定值,即n=p+k*M(设固定值M,p、k为常数,p、k>=0)。题目已经说明B范围为0~m,我也是,这样我们俩一起就是0~2m,那么所谓的固定值只能为m+1,这样我才能保证不管对方拿多少我固定值每次都能取到。有了该固定值,我就能计算了。

        首先从B开始拿,经过数个M后,剩余s(s<m)。由公式n=p+k*M,p=s。

        好,现在假设B的智商和我是一样的;那么由对方先拿,对方一开始一定会拿p个,那么剩下来,对方保证和我一起拿M,最后肯定是对方赢。若p=0,那么我保证我和对方每次都拿M,我就赢了。

代码:

#include<stdio.h>int main(){int n,a,b,m=0;scanf("%d",&n);while( n-- ){scanf("%d%d",&a,&b);     m =a % ( 1 + b);if( m  != 0)printf("first\n");elseprintf("second\n");}return 0;}




0 0
原创粉丝点击