1740 A New Stone Game

2024-06-14 07:18
文章标签 new game 1740 stone

本文主要是介绍1740 A New Stone Game,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意:

有N堆石头,两人分别从这N堆石头中取走石头,去石头的规则是:玩家必须从任一堆石头中取走至少一块石头,可以全部取走。如果没有全部取走,可以把剩下的石头任意数目一道其他任一堆石头上去,最后不能取时候的人为输。

解题思路:

对于博弈题目做的毕竟还是少,很多的博弈题的规律还没有找到,从网上看了一下解题报告,想法真的很好,代码实现起来也很简单。废话少说,切入正题:

首先讨论对于N堆石头数目两两相等的情况,假设为x,x,y,y,z,z,那么先取者必输,因为无论先取得人如何操作,后取的人都可以做同样的操作(先取者取走一堆中任意数目的石头,后取者都可以从和这堆石头数目相同的那一堆中取走数目相同的石头数,如果先取者把石头移动到其他堆上去,那么后取者也可以移动相同数目的石头到对应的石头堆上去),直至后者把最后的石头取完。

由这个结论,就可以把N堆石头中数目相同的两对去掉,只讨论两两不相同的情况:

1、只有一对石头,数目为x,则先取者胜。

2、只有两堆石头,数目为x,y(递增的顺序),则先取者胜。先取者可以从数目为y的那堆石头中取走y-x块石头,这样两堆石头数目相同。

3、只有三堆石头,数目为x,y,z(递增顺序),从第三堆石头中取走z-y+x块石头,然后把剩下的y-x块石头移动到第一堆中,变只有两对,数目为y,y的局势。还是先取者获胜。

4、以此类推,只要堆石头数目最大的那一堆进行操作,总能达到两两相等的局势,所以只要石头的数目不全是两两相等,那么先取者必胜。

代码:

#include<cstdio>
#include<cstring>int main(){int n,num[20];int mark[105];while(scanf("%d",&n), n){memset(mark,0,sizeof(mark));for(int i=0; i<n; i++){scanf("%d",&num[i]);if(mark[num[i]]) mark[num[i]]--;else mark[num[i]]++;}int flag=0;for(int i=0;i<105;i++){  //统计是不是全部都两两相等if(mark[i]) flag++;}//printf("flag=%d\n",flag);if(flag) printf("1\n");else printf("0\n");}return 0;
}



这篇关于1740 A New Stone Game的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1059732

相关文章

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

List list = new ArrayList();和ArrayList list=new ArrayList();的区别?

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。 List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了A

10400 -Game Show Math

这道题的话利用了暴力深搜,尽管给了20S,但是这样还会超时,所以就需要利用回溯进行减枝,因为是DFS,所以用一个数组vis[i][j]记录是否在状态i时候取到过j值,如果取到过的话,那么直接回溯(往后搜索已经没有意义了,之前到达这个状态的时候是无法得到结果的) 还有需要注意的地方就是题目的要求,每一步的结构都在(-32000,32000)之间,所以需要一步判断,如果在这个范围外直接回溯 最后一

vue原理分析(六)--研究new Vue()

今天我们来分析使用new Vue() 之前研究时,只是说是在创建一个实例。并没有深入进行研究 在vue的源码中找下Vue的构造函数 function Vue(options) {if (!(this instanceof Vue)) {warn$2('Vue is a constructor and should be called with the `new` keyword');}thi

GTK中创建线程函数g_thread_new和g_thread_create的区别

使用GThread函数,需要引用glib.h头文件。 这两个接口的核心区别就是  g_thread_create 是旧的接口,现在已经不使用了,而g_thread_new是新的接口,建议使用。 g_thread_create: g_thread_create has been deprecated since version 2.32 and should not be used in n

New的VC编译器实现

当我们调用 new 的时候,例如 int *p = new int; 时,编译器到底作了什么工作呢?跟进断点看一看。   (在 vc debug模式下 ) double *p1 = new double ; 00411A6E  push        8    00411A70  call        operator new (4111B8h) 00411A75  add

Python方法:__init__,__new__,__class__的使用详解

转自:https://blog.csdn.net/qq_26442553/article/details/82464682 因为python中所有类默认继承object类。而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际