zoukankan      html  css  js  c++  java
  • 91-博弈- 取石头 (10分)

                                                                 653.博弈- 取石头 (10分)
    C时间限制:3000 毫秒 | C内存限制:3000 Kb
    题目内容:
    m堆石子,甲乙两人轮流取,每次需先选择1堆,并取任意数目的石子. 最后取完者的获胜.
    规定甲先取。
    输入描述
    可能有多组测试数据。每组的第一行是m, 第二行是m个整数,表示每堆石子的数目。

    输出描述
    每个测试用例,甲失败则输出“No”。
    否则输出"Yes", 并在下面的行输出取法。
    按堆号顺序输出各种甲能取胜的首次取法a,b,表示在第a堆石子中取完石子后剩下b个,甲可以获胜。

    输入样例
    2
    45 45
    3
    3 6 9
    5
    5 7 8 9 10

    输出样例
    No
    Yes
    9 5
    Yes
    8 1
    9 0
    10 3

    http://www.mamicode.com/info-detail-2425837.html


    技术分享图片

    技术分享图片

    技术分享图片

    其实就是看你能不能保证让异或后为零,可以理解为异或为零了,就可以保证别人怎么取,你就怎么取,让别人输。

    如果开始异或不为零,你就可以赢,同时取走k个保证之后异或为零,取走多少呢,就是保证之后异或为零,既可以找一个 ni 使其和 k 异或,得到 n,(保证ni大于n)

    这样,相当于从ni中取走了ni - n 个石子。

    #include <iostream>
    using namespace std;
    int a[1000];
    
    int main(){
    	int n;
    	
    	while(cin >> n){
    		int ans;
    		cin >> ans;
    		for(int i = 1; i < n; i++){
    			cin >> a[i];
    			ans ^= a[i];
    		}
    		if(ans == 0){ // 奇异局必败 
    			cout << "No" << endl;
    			continue; 
    		}
    		cout << "Yes" << endl;
    		for(int i = 0; i < n; i++){
    			int rt = a[i] ^ ans;
    			if(rt < a[i]){
    				cout << a[i] << " " << rt << endl;
    			}
    		} 
    	}
    	
    	return 0;
    }
    

      

  • 相关阅读:
    Python
    Html body的滚动条禁止与启用
    wampserver 更改www目录
    Linux下的tar压缩解压缩命令详解
    Linux 重置root密码
    Ubuntu增加一个用户并给普通用户赋予root权限的方法
    redhat系统下三种主要的软件包安装方法
    Linux 添加yum命令
    如何退出 Vim
    Linux ssh开启服务
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/10854064.html
Copyright © 2011-2022 走看看