• CodeForces 768E Game of Stones 打表找规律


    题意:

    在经典Nim博弈的基础上增加了新的限制:如果从这堆石子中移走(x)个石子,那么之后就不能再从这堆移走(x)个。

    分析:

    因为之前的操作会对后面的转移有影响,所以在保存状态时还要记录哪些数量的石子可以移走。
    (d(i,S))表示现在有(i)个石子,(S)(1)的位置表示可以移走对应数量的石子,打表求出(SG)函数值。

    打表代码:

    #include <cstdio>
    #include <cstring>
    
    bool vis[100];
    
    int mex() {
    	for(int i = 0; ; i++) if(!vis[i]) return i;
    }
    
    int sg[11][1 << 10];
    
    int main()
    {
    	memset(sg, -1, sizeof(sg));
    	for(int i = 0; i < (1 << 10); i++) sg[0][i] = 0;
    	for(int i = 1; i <= 10; i++) {
    		sg[i][0] = 0;
    		for(int j = 1; j < (1 << 10); j++) {
    			memset(vis, false, sizeof(vis));
    			for(int k = 0; k < i; k++) if((j >> k) & 1)
    				vis[sg[i - k - 1][j ^ (1 << k)]] = true;
    			sg[i][j] = mex();
    		}
    	}
    
    	for(int i = 0; i <= 10; i++)
    		printf("i = %d: sg = %d
    ", i, sg[i][(1 << i) - 1]);
    
    	return 0;
    }
    

    找到规律后就把问题解决了。

    #include <cstdio>
    
    int sg[61];
    
    int main()
    {
    	for(int i = 1, p = 1; p <= 60; i++) {
    		for(int j = 0; j < i + 1 && p <= 60; j++) {
    			sg[p++] = i;
    		}
    	}
    
    	int ans = 0;
    	int n; scanf("%d", &n);
    	while(n--) { int x; scanf("%d", &x); ans ^= sg[x]; }
    	if(ans) printf("NO
    "); else printf("YES
    ");
    
    	return 0;
    }
    
  • 相关阅读:
    单例模式
    collections额外数据类型
    logging的简单使用
    杂记
    字符编码
    面向对象编程简介
    logging模块
    re与subprocess模块
    oepnpyxl模块 与excle交互
    json序列化模块
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/6428760.html
Copyright © 2020-2023  润新知