zoukankan      html  css  js  c++  java
  • D. GameGame(博弈论)

    题意:Koa the Koala和她的好朋友一起去玩游戏。这个游戏由n个非负的整数组成,Koa还有她的好友轮流玩这个游戏并且每个人都有一个初始分数0。让我们描述这个操作的每一步:
    1.选择一个数字并且异或到自己的分数上。

    如果两个人最后得到的分数一样,那么就是平局,否则分值最大的胜利。Koa先手。

    分析:异或题,我们一般都从最高位开始考虑,异或具有一些性质,比如(1 oplus 1 = 0, 1 oplus 0 = 1, x oplus x = 0, x oplus 0 = x)。我们考虑所有的数,并从最高位开始考虑,,我们的koa是先手的,如果每个人都采用最优策略,那么第一个人拿什么,第二个人也会做同的操作,如果是这样的话,统计每个数最高位的1的个数和0的个数,如果有偶数个1的话,这些1异或起来就会为0,这两个人在这一位就会是平手,继续考虑下一位,直到出现奇数个1的时候,我们再分类讨论。
    1.首先是平局的情况,那么所有数异或起来为0,即每一位都是平局,输出"DRAW"即可。
    2.其次是如果出现某一位有奇数个1的话,我们分类讨论,首先是如果这一位1的个数%4 == 3并且0的个数%2 == 0,那么是后手赢,否则是先手赢。假设1的个数为x,0的个数为y。我们考虑x % 4的情况,如果x % 4 == 1的话,我们先手拿掉一个1,接下来另一个人做什么,我们都做相同的动作,如果y % 2 == 0的话,那很好说,最后我们的先手会多出一个1,如果y % 2 == 1的话,我们最后剩下的0,不管谁拿,都没事,因为还是先手赢,因为1的个数为4的倍数,我们只要和另一个人的动作相同即可。
    考虑x % 4 == 3的情况,首先是y % 2 == 0,第一个人作什么,第二个人跟着照做,会发现不管怎么操作,第一个人会有偶数个1,那么就是第二个人赢。再考虑y % 2 == 1的情况,我们的第二个人拿走了一个0,那么就又变成了x % 4 == 3,并且y % 2 == 1的情况了,此是是第一个人胜利。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <algorithm>
    
    using namespace std;
    const int N = 100005;
    int a[N];
    int main()
    {
    	int t;
    	scanf("%d", &t);
    
    	while (t--)
    	{
    		int n;
    		scanf("%d", &n);
    		int res = 0;
    		for (int i = 1; i <= n; ++i) scanf("%d", &a[i]), res ^= a[i];
    
    		if (res == 0)
    		{
    			puts("DRAW");
    		}
    		else
    		{
    			int s = 0, pos = 30;
    			for (int i = 31; i >= 0; --i)
    			{
    				if ((res >> i) & 1)
    				{
    					pos = i;
    					break;
    				}
    			}
    
    			int cnt = 0;
    			for (int i = 1; i <= n; ++i)
    			{
    				if ((a[i] >> pos) & 1)
    					++cnt;
    			}
    			int x = cnt;
    			int y = n - x;
    
    			if (x % 4 == 3 && y % 2 == 0)
    				puts("LOSE");
    			else
    				puts("WIN");
    		}
    	}
    
    	return 0;
    }
    
  • 相关阅读:
    ConcurrentHashMap的初步使用场景、源码分析讲解(中)
    ConcurrentHashMap的初步使用场景、源码分析讲解(上)
    CyclicBarrier用例、源码分析讲解
    Semaphore用例、源码分析讲解
    CountDownLatch用例、源码分析讲解
    Condition用例、源码分析详解(下)
    Condition用例、源码分析详解(上)
    图解数据结构之数组、链表、栈、队列
    Python--day27--复习
    Python--day26--反射
  • 原文地址:https://www.cnblogs.com/pixel-Teee/p/13445747.html
Copyright © 2011-2022 走看看