取(m堆)石子游戏

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1741    Accepted Submission(s): 1014

Problem Description
m堆石子,两人轮流取.仅仅能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出如何取子.比如5堆 5,7,8,9,10先取者胜,先取者第1次取时能够从有8个的那一堆取走7个剩下1个,也能够从有9个的中那一堆取走9个剩下0个,也能够从有10个的中那一堆取走7个剩下3个.
 
Input
输入有多组.每组第1行是m,m<=200000. 后面m个非零正整数.m=0退出.
 
Output
先取者负输出No.先取者胜输出Yes,然后输出先取者第1次取子的全部方法.假设从有a个石子的堆中取若干个后剩下b个后会胜就输出a b.參看Sample Output.
 
Sample Input
2
45 45
3
3 6 9
5
5 7 8 9 10
0
 
Sample Output
No
Yes
9 5
Yes
8 1
9 0
10 3
/*
加了半天凝视也还是没搞得清清楚楚了,要睡觉了。原谅我吧,先A了,加油! !!
Time:2014-8-26 1:03
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
int a[200000+10];
int main(){
int N;
while(scanf("%d",&N),N){
int ans=0,sum=0;
memset(a,0,sizeof(a));
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
ans^=a[i];
sum+=a[i];
}
if(ans==0)
printf("No\n");
else{
printf("Yes\n");
//printf("%d\n",sum-ans);
for(int i=0;i<N;i++){
int x=(a[i]^ans);//ans相当于剩余的个数
//x相当于去掉 a[i],即不取a[i]
//ans=0为先手必败态,先手取掉剩余的个数ans
//仅仅要先手去掉。就能够使后手成为必败态的先手。即异或为0且先手先取
if(x<a[i])
//假设去掉 a[i]后剩的个数小于堆中的个数,便可取
//比方 2堆 3 1 为 必胜态,先手取掉 x即 3-1便可转化为先手必败的1 1
printf("%d %d\n",a[i],x);
}
}
}
return 0;
}

杭电 2176 取(m堆)石子游戏(博弈)的更多相关文章

  1. HDU 2176 取(m堆)石子游戏(Nim)

    取(m堆)石子游戏 题意: Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,1 ...

  2. HDU 2176:取(m堆)石子游戏(Nim博弈)

    取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. HDU 2176 取(m堆)石子游戏 (尼姆博奕)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎 ...

  4. HDU 2176 取(m堆)石子游戏 && HDU1850 Being a Good Boy in Spring Festivaly

    HDU2176题意: m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子. 通过 SG定理 我们可以知道每一个数的SG值,等于这个数到达不了的前面数 ...

  5. hdu 2176 取(m堆)石子游戏 (裸Nim)

    题意: m堆石头,每堆石头个数:a[1]....a[m]. 每次只能在一堆里取,至少取一个. 最后没石子取者负. 先取者负输出NO,先取胜胜输出YES,然后输出先取者第1次取子的所有方法.如果从有a个 ...

  6. HDU 2176 取(m堆)石子游戏 —— (Nim博弈)

    如果yes的话要输出所有情况,一开始觉得挺难,想了一下也没什么. 每堆的个数^一下,答案不是0就是先取者必胜,那么对必胜态显然至少存在一种可能性使得当前局势变成必败的.只要任意选取一堆,把这堆的数目变 ...

  7. HDU 2176 取(m堆)石子游戏 尼姆博弈

    题目思路: 对于尼姆博弈我们知道:op=a[1]^a[2]--a[n],若op==0先手必败 一个简单的数学公式:若op=a^b 那么:op^b=a: 对于第i堆a[i],op^a[i]的值代表其余各 ...

  8. HDU 2176 取(m堆)石子游戏(尼姆博奕)

    nim基础博弈 #include<stdio.h> #include<iostream> #include<cstring> #include<queue&g ...

  9. HDU-2176 取(m堆)石子游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=2176 第三种博弈,但一定要注意优化时间 取(m堆)石子游戏 Time Limit: 3000/1000 MS ( ...

随机推荐

  1. python 五——自定义线程池

    内容概要: 1.low版线程池 2.绝版线程池 1.low版线程池 设计思路:运用队列queue 将线程类名放入队列中,执行一个就拿一个出来 import queue import threading ...

  2. Cookie测试的测试点

    1.禁止使用Cookie:设置浏览器禁止使用Cookie,访问网页后,检查存放Cookie文件中未生成相关文件: 2.Cookie寻出路径:按照操作系统和浏览器对Cookie存放路径的设置,检查存放路 ...

  3. HDU 5514 Frogs

    Frogs Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 5514 ...

  4. “玲珑杯”ACM比赛 Round #19

    A -- A simple math problem Time Limit:2s Memory Limit:128MByte Submissions:1599Solved:270 DESCRIPTIO ...

  5. hdu2081

    #include <stdio.h> #include <malloc.h> int main(){ ]; char *p; int t; p=(); scanf(" ...

  6. SQL indexOf、lastIndexOf

    DECLARE @Name NVARCHAR (50)SET @Name = 'abcd.12345.efght' DECLARE @Position INT --sql first indexofS ...

  7. Apple Pay强势来袭,开发者应做的事情(转)

    "iOS8.1就已经有这个功能了,只是木有现在这么的火,现在的趋势是要火的节奏,因此很多电商平台B2B,P2P,C2C,X2X都有可能需要这个屌丝的付款功能了,在此简单的研究一下." ...

  8. 刷题总结——保留道路(ssoj)

    题目: 题目背景 161114-练习-DAY1-AHSDFZ T3 题目描述 很久很久以前有一个国家,这个国家有 N 个城市,城市由 1,2,3,…,,N 标号,城市间有 M 条双向道路,每条道路都有 ...

  9. 【bzoj2238】Mst(树链剖分+线段树)

    2238: Mst Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 465  Solved: 131[Submit][Status][Discuss] ...

  10. essential c++ 随笔

    编写一个C++程序: vector初始化两种方法: vector<int>elem_seq(seq_size); elem_seq[0]=1 elem_seq[1]=2; 另一种方法则是利 ...