zoukankan      html  css  js  c++  java
  • 博弈论

    博弈论

    sg函数

    void getSG(int n) {
    	memset(SG,0,sizeof(SG));
    	for(int i=1;i<=n;i++) {
    		memset(vis,0,sizeof(vis));//后继状态是否出现过数字
    		for(int j=0;f[j]<=i&&j<=N;j++) 
    			vis[SG[i-f[j]]]=1;//将后继状态出现过得标记
    		for(int j=0;;j++) {//mex
    			if(!vis[j]) {
    				SG[i]=j;
    				break;
    			}
    		}
    	}
    }
    

    ​ HDU1848:http://acm.hdu.edu.cn/showproblem.php?pid=1848

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int N=10005;
    inline int read() {
    	int x=0;char ch=getchar();
    	while(ch<'0'||ch>'9') ch=getchar();
    	while(ch>='0'&&ch<'9') {x=x*10+ch-'0';ch=getchar();}
    	return x;
    }
    int SG[N],f[N];
    bool vis[N];
    void get(int n) {
    	memset(SG,0,sizeof(SG));
    	for(int i=1;i<=n;i++) {
    		memset(vis,0,sizeof(vis));
    		for(int j=1;f[j]<=i&&j<=20;j++)
    			vis[SG[i-f[j]]]=1;
    		for(int j=0;;j++)
    			if(!vis[j]){
    				SG[i]=j;
    				break;
    			}
    	}
    }
    int main() {
    	f[1]=1;f[2]=2;
    	for(int i=3;i<=25;i++)
    		f[i]=f[i-1]+f[i-2];
    	get(1001);
    	int x,y,z;
    	while(scanf("%d%d%d",&x,&y,&z)&&(x+y+z)!=0) {
    		int ans=0;
    		ans^=SG[x];
    		ans^=SG[y];
    		ans^=SG[z];
    		if(!ans) puts("Nacci");
    		else puts("Fibo");
    	}
    
    	return 0;
    }
    

    HDU2149:http://acm.hdu.edu.cn/showproblem.php?pid=2149

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #define sscc ios::sync_with_stdio(false)
    #define ms(a) memset(a,0,sizeof(a))
     
    using namespace std;
    
    int a[100005],vis[10000];
    int f[10005],c[10005];
    
    int SG(int n,int m){
    	ms(a);
    	a[0]=0;
    	for(int i=1;i<=n;i++){
    		ms(vis);
    		for(int j=1;j<=m;j++){
    			if(i>=f[j]){
    				vis[a[i-f[j]]]=1;
    			}else{
    				break;
    			}
    		}
    		for(int j=0;j<=n;j++){
    			if(vis[j]==0){
    				a[i]=j;
    				break;
    			}
    		}
    	}
    	return a[n];
    }
    
    int main()
    {
    	sscc;
    	for(int i=1;i<=1101;i++){
    		f[i]=i;	
    	}
    	int n,m;
    	while(cin>>m>>n){
    		if(SG(m,n)!=0){
    			int ans=0;
    			for(int j=1;j<=n;j++){
    				if(m>=f[j]){
    					if(a[m-f[j]]==0)
    						c[ans++]=f[j];
    				}else{
    					c[ans++]=f[j];
    				}
    			}
    			for(int i=0;i<ans;i++){
    				if(i==0)
    					cout<<c[i];
    				else
    					cout<<" "<<c[i];
    			}
    			cout<<endl;
    		}
    		else
    			cout<<"none"<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    asp.net 验证正则表达式
    c语言编程题
    使用Code First创建数据模型
    c语言知识点
    rabbitmq 简单应用
    influxdb(二)
    influxdb(一)
    K8S 日志收集(六):kibana 安装
    K8S 日志收集(五):head插件安装
    K8S 日志收集(四):logstash 安装
  • 原文地址:https://www.cnblogs.com/ke-xin/p/13835680.html
Copyright © 2011-2022 走看看