首页 > 代码库 > 【hdu1846】Brave Game
【hdu1846】Brave Game
这道题就是noi.openjudge.cn上的取石子问题,之前是用搜索写的,但今天发现用博弈论的思路来写会简单非常非常多!
首先,如果m>=n,那么第一个人必胜。
那么如果现在剩下m+1个石子,那么接下来那个人无论取1到m中任意一个数字的石子数,都无法取完石子并会剩下1-m个石子,这样的话下一个人一定获胜。
换句话说,剩下m+1个石子的话接下来要取的人一定输。
所以若m+1<n<2(m+1),现在这一个人只要取n-(m+1)个石子,他就一定赢。
而当2(m+1)<n<3(m+1)时,这个人只要取(n-2(m+1))个石子,那么他的对手取后就会出现刚刚的m+1<n<2(m+1)那种情况,他还是必胜。
推广一下,只要存在一个i,使得 i*(m+1)<n<(i+1)*(m+1)成立,则第一个人必胜;反之,若存在一个i使得i*(m+1)==n,则第二个人必胜。
好了,分析完之后代码就很简单了:
#include<cstdio> int main() { int c,n,m; scanf("%d",&c); while(c--) { scanf("%d %d",&n,&m); if(m>=n){printf("first\n");continue;} for(int i=1;;i++) { if(i*(m+1)<n&&(i+1)*(m+1)>n){printf("first\n");break;} else if(i*(m+1)==n){printf("second\n");break;} } } return 0; }
【hdu1846】Brave Game
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。