zoukankan      html  css  js  c++  java
  • [SDOI2009]E&D

    [SDOI2009]E&D

    题目大意:

    (2n(nle2 imes10^4))堆石子,第(i)堆石子有(x_i)个,第(2k)与第(2k+1)堆为一组。每次选取一组,移除其中一堆,并从另一堆石子中取出若干颗放到被移除的位置上。操作过程中需要保证任意一堆石子个数为正,两人轮流操作,不能操作者负,问若两人都按照最优策略,最后谁能取胜?

    思路:

    每组石子是一个相对独立的游戏,对于每组两堆石子的个数暴力计算SG函数并打表,发现后继状态SG值集合(S)用二进制表示的结果为((x_1-1)vee(x_2-1))

    证明略。

    源代码:

    #include<cstdio>
    #include<cctype>
    inline int getint() {
    	register char ch;
    	while(!isdigit(ch=getchar()));
    	register int x=ch^'0';
    	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    	return x;
    }
    int main() {
    	for(register int T=getint();T;T--) {
    		const int n=getint()>>1;
    		int sg=0;
    		for(register int i=0;i<n;i++) {
    			int s=(getint()-1)|(getint()-1),mex=0;
    			for(;s&1;s>>=1) mex++;
    			sg^=mex;
    		}
    		puts(sg?"YES":"NO");
    	}
    	return 0;
    }
    
  • 相关阅读:
    解释之前遗留的方法覆盖问题
    多态在开发中的作用
    多态的基础语法
    Go 统计汉子字符
    Go map
    Go make和new的区别
    Go 指针
    Go 切片
    Go数组
    Go中交换两个值类型
  • 原文地址:https://www.cnblogs.com/skylee03/p/9768290.html
Copyright © 2011-2022 走看看