zoukankan      html  css  js  c++  java
  • Georgia and Bob

    POJ

    题意:给定(N)个数,Georgia和Bob轮流操作,每次可以让一个数减去一个正整数,但要保证数列严格单调递增,求谁会获胜?

    分析:如果没有保证数列严格单调递增这个限制,就是传统的Nim博弈---取石子游戏.于是考虑把它往Nim上靠.我们把(N)个数先(sort)排序,从最后一个数开始拆成两个两个来看,如果第一个数落单,就看作和第0个数凑成了一对.

    对于一对数,如果对手让前一个数减去了一个数,我们就可以直接让后一个数减去同一个数,对于这一种情况,我们可以看作什么都没有发生,因为不会影响到结果;

    而如果对手让后一个数减去了一个数,此时如果我们让前一个数也减去相同的数,可能会造成前一个数比 前一对数的后一个数 要小,不符合题意,也就是说减去的这一个数是会影响到最后的结果的,而减去的这一个数也有范围限制,即(a[i]-a[i-1]-1).

    我们把每一对数的这个值拎出来,就变成了传统的取石子游戏---谁没办法再取谁就输了.

    //#include<bits/stdc++.h>
    #include<cstring>
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    inline int read(){
       int s=0,w=1;char ch=getchar();
       while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
       while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
       return s*w;
    }
    int a[1005];
    int main(){
        int T=read();
        while(T--){
    		int ans=0,n=read();
    		for(int i=1;i<=n;i++)a[i]=read();
    		sort(a+1,a+n+1);
    		for(int i=n;i>=1;i-=2)ans^=(a[i]-a[i-1]-1);
    //因为是严格单调递增,所以还要减去1
    		if(ans)puts("Georgia will win");
    		else puts("Bob will win");
        }
        return 0;
    }
    
    
  • 相关阅读:
    LeetCode 977 有序数组的平方
    LeetCode 24 两两交换链表中的节点
    LeetCode 416 分割等和子集
    LeetCode 142 环形链表II
    LeetCode 106 从中序与后序遍历序列构造二叉树
    LeetCode 637 二叉树的层平均值
    LeetCode 117 填充每个节点的下一个右侧节点
    LeetCode 75 颜色分类
    redhat 7.4 挂载ntfs格式的u盘并且使用
    redhat 查看CPU frequency scaling(CPU频率缩放)
  • 原文地址:https://www.cnblogs.com/PPXppx/p/10884564.html
Copyright © 2011-2022 走看看