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

    jisoo

    从只有几个棋子开始考虑

    只有一个的话先手必胜

    只有两个的话先手如果动前一个棋子,那么后手一定也可以动

    那么先手唯一的方案就是动后面的棋子

    这样的话如果有三个,先手动中间的那一个是没有意义的,后手一定可以动最后于一个

    如果先手动第一个,后手动中间的也是没有意义的,那么后手要不动第一个要不动最后一个

    这样的话中间棋子的位置无所谓,我们只关心第一个棋子的位置,和最后一个棋子到前一个棋子的距离

    这样的话这场博弈两两棋子一组,如果是奇数总数把第一个和所谓"0"绑定一下就可以了

    然后每一组,如果先手动第一个棋子是没有意义的,两个棋子碰到一块,那么后手必胜,所以问题的关键就是如何把每一组变成两个靠在一块

    方法就是,

    nim博弈

    然后这个题就结束了

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int n;
    int t;
    int a[100001];
    int sum;
    int main(){
    	scanf("%d",&t);
    	while(t--){
    		scanf("%d",&n);
    		for(int i=1;i<=n;++i) {
    			scanf("%d",&a[i]);
    		}
    		if(n&1){
    			n++;
    			a[n]=0;
    		}
    		sort(a+1,a+n+1);
    		sum=0;
    		for(int i=1;i<=n;i+=2){
    			sum^=(a[i+1]-a[i]-1); 
    		}
    		if(!sum){
    			printf("Bob will win
    ");
    		}else{
    			printf("Georgia will win
    ");
    		}
    	}
    	return 0;
    } 
    
  • 相关阅读:
    java-抽象类
    java-接口
    java-面向对象总结
    java-单例设计模式
    java数组
    .Net框架整理
    PHP结合memcacheq消息队列解决并发问题
    浅谈DDos攻击
    PHP+ffmpeg+nginx的配置实现视频转码(转)
    使用Nginx的X-Accel-Redirect实现大文件下载
  • 原文地址:https://www.cnblogs.com/For-Miku/p/15230788.html
Copyright © 2011-2022 走看看