• test20181006 石头剪刀布


    题意


    分析

    考场做法同题解一样。

    std代码。

    #include<bits/stdc++.h>
    using namespace std;
    
    template <typename T> void chmin(T&x,const T &y)
    {
    	if(x>y)x=y;
    }
    template <typename T> void chmax(T &x,const T &y)
    {
    	if(x<y)x=y;
    }
    typedef long long s64;
    typedef unsigned long long u64;
    typedef unsigned int u32;
    typedef pair<int,int> pii;
    #define rep(i,l,r) for(int i=l;i<=r;++i)
    #define per(i,r,l) for(int i=r;i>=l;--i)
    #define rep0(i,l,r) for(int i=l;i<r;++i)
    #define gc (c=getchar())
    int read()
    {
    	char c;
    	while(gc<'-');
    	if(c=='-')
    	{
    		int x=gc-'0';
    		while(gc>='0')x=x*10+c-'0';
    		return -x;
    	}
    	int x=c-'0';
    	while(gc>='0')x=x*10+c-'0';
    	return x;
    }
    #undef gc
    
    int n,need_a[3];
    const char s[]="RPS";
    string write(int n,int x)
    {
    	if(!n)
    	{
    		string ans;
    		ans.push_back(s[x]);
    		return ans;
    	}
    	string a=write(n-1,x),b=write(n-1,(x+1)%3);
    	return a<b?a+b:b+a;
    }
    bool check(int x)
    {
    	int a[3]={},a0[3];
    	a[x]=1;
    	rep(tmp,1,n)
    	{
    		rep(i,0,2)a0[i]=a[i];
    		rep(i,0,2)a[(i+1)%3]+=a0[i];
    	}
    	//cerr<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
    	rep(i,0,2)
    	if(a[i]!=need_a[i])return 0;
    	cout<<write(n,x)<<endl;
    	return 1;	
    }
    
    int main()
    {
    	freopen("rps.in","r",stdin);freopen("rps.out","w",stdout);
    		rep(i,0,2)need_a[i]=read();
    		n=0;
    		while((1<<n)!=need_a[0]+need_a[1]+need_a[2])++n; 
    		int i=0;
    		for(;i<=2;++i)
    		if(check(i))break;
    		if(i>2)puts("IMPOSSIBLE");
    }
    

    我的代码。排序的时候我用的递推处理,跑得比std快。

    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<ctime>
    #include<iostream>
    #include<string>
    #include<vector>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<map>
    #include<set>
    #include<bitset>
    #include<algorithm>
    #include<complex>
    #pragma GCC optimize ("O0")
    using namespace std;
    template<class T> inline T read(T&x)
    {
        T data=0;
    	int w=1;
        char ch=getchar();
        while(!isdigit(ch))
        {
    		if(ch=='-')
    			w=-1;
    		ch=getchar();
    	}
        while(isdigit(ch))
            data=10*data+ch-'0',ch=getchar();
        return x=data*w;
    }
    typedef long long ll;
    const int INF=0x7fffffff;
    
    const int MAXN=1<<20|7;
    
    int a[2][MAXN],len[2];
    int cur;
    
    int main()
    {
      freopen("rps.in","r",stdin);
      freopen("rps.out","w",stdout);
    	int R,P,S;
    	read(R);read(P);read(S);
    	int n;
    	for(int i=1;i<=20;++i)
    		if(R+P+S==(1<<i))
    			n=i;	
    //	cerr<<"n="<<n<<endl;
    	for(int i=1;i<=3;++i)
    	{
    		cur=0;
    		len[cur]=0;
    		a[cur][++len[cur]]=i;
    		for(int j=1;j<=n;++j)
    		{
    			cur^=1;
    			len[cur]=0;
    			for(int k=1;k<=len[cur^1];++k)
    			{
    				if(a[cur^1][k]==1)
    				{
    					a[cur][++len[cur]]=1;
    					a[cur][++len[cur]]=2;
    				}
    				else if(a[cur^1][k]==2)
    				{
    					a[cur][++len[cur]]=2;
    					a[cur][++len[cur]]=3;
    				}
    				else
    				{
    					a[cur][++len[cur]]=1;
    					a[cur][++len[cur]]=3;
    				}
    			}
    		}
    		int r=0,p=0,s=0;
    		for(int j=1;j<=len[cur];++j)
    		{
    			if(a[cur][j]==1)
    				++p;
    			else if(a[cur][j]==2)
    				++r;
    			else
    				++s;
    		}
    		if(R==r&&P==p&&S==s)
    		{
    			for(int l=1;l<=n;++l) // the log of the sum of swap len
    			{
    				int d=(1<<l); // the sum of swap len
    				for(int j=1;j<len[cur];j+=d)
    				{
    					int x=j,y=j+(d>>1);
    					while(a[cur][x]==a[cur][y]&&x<j+(d<<1))
    						++x,++y;
    					if(x<j+(d<<1))
    					{
    //						cerr<<"x="<<x<<" y="<<y<<endl;
    //						cerr<<"cmp"<<a[cur][x]<<" "<<a[cur][y]<<endl;
    						if(a[cur][x]<a[cur][y])
    							continue;
    //						cerr<<"swap fr "<<j<<" to "<<(j+(d>>1))<<endl;
    						for(int k=j;k<j+(d>>1);++k)
    							swap(a[cur][k],a[cur][k+(d>>1)]);
    					}
    				}
    			}
    			for(int j=1;j<=len[cur];++j)
    			{
    				if(a[cur][j]==1)
    					putchar('P');
    				else if(a[cur][j]==2)
    					putchar('R');
    				else
    					putchar('S');
    				
    			}
    			puts("");
    			return 0;
    		}
    	}
    	puts("IMPOSSIBLE");
    //  fclose(stdin);
    //  fclose(stdout);
        return 0;
    }
    
    静渊以有谋,疏通而知事。
  • 相关阅读:
    Angular常用VSCode插件
    asp.net MVC设计模式中使用iTextSharp实现html字符串生成PDF文件
    Docker Compose部署 EFK(Elasticsearch + Fluentd + Kibana)收集日志
    强烈推荐这本书《编码:隐匿在计算机软硬件背后的语言》
    frp 内网穿透访问内网Web服务
    代码玄学——镇代码的注释
    C#基础之多线程与异步
    C#基础之事件(1)
    WPF之Unity与ServiceLocator运用
    WPF之实现控件内容拖动
  • 原文地址:https://www.cnblogs.com/autoint/p/9747366.html
Copyright © 2020-2023  润新知