题意



分析

考场做法同题解一样。

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;
}

test20181006 石头剪刀布的更多相关文章

  1. 原创:微信小程序源码解说:石头剪刀布(附源码下载)

    我的博客:来源链接 昨天看有个石头剪刀布的练习,就拿出来做了一下,布局的代码浪费了很多时间,果然CSS这块的还不是很熟练,下面直接上图上代码了. JS: var numAi = 0 var timer ...

  2. 洛谷P1328 生活大爆炸版石头剪刀布——S.B.S.

    题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...

  3. C# Winform学习--- 实现石头剪刀布的游戏

    本文使用winform实现简单的石头剪刀布的游戏,主要实现,电脑随机出拳,玩家手动点击出拳:实现简易背景图片3秒切换:简易统计信息. 1.效果图 2.实现代码 新建一个windows窗体程序,用数字1 ...

  4. P1905生活大爆炸版 石头剪刀布

      P1905生活大爆炸版 石头剪刀布 描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第 8 集中出现了一种石头 ...

  5. AC日记——石头剪刀布 openjudge 1.6 08

    08:石头剪刀布 总时间限制:  1000ms 内存限制:  65536kB 描述 石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. 一天,小A和小B正好在 ...

  6. luogu1328[NOIP2014 T1]生活大爆炸版石头剪刀布

    题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...

  7. [NOIP2014] 提高组 洛谷P1328 生活大爆炸版石头剪刀布

    题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...

  8. NOIp 2014 #1 生活大爆炸版石头剪刀布 Label:模拟

    题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...

  9. A:石头剪刀布

    总时间限制: 1000ms 内存限制: 65536kB描述石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.一天,小A和小B正好在玩石头剪刀布.已知他们的出拳 ...

随机推荐

  1. Lua脚本语言入门学习其应用教程

    Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用.不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更 ...

  2. C++中的赋值运算符重载函数(operator=)

    MyStr& operator =(const MyStr& str)//赋值运算符 { cout << "operator =" << e ...

  3. UVA-1579 Matryoshka (区间DP)

    题目大意:n个俄罗斯套娃,都有相应的编号,每次可将两个相邻的套娃组合成一组,每次合成只能小的放到大的里面,并且是逐层嵌套.问将这n个套娃分成若干个组,并且每组都是编号从1开始的连续序列,最少需要几步. ...

  4. Oracle11g温习-第六章:控制文件

    2013年4月27日 星期六 10:33  .控制文件的功能和特点 1) [定义数据库当前物理状态] 2) [维护数据的一致性]  如果控制文件中的检查点与数据文件中的一致,则说明数据一致,可以启动到 ...

  5. 计时(.NET)

    using System.Diagnostics; // 开始计时 Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 要计时的操 ...

  6. spring创建单例bean

    (使用的spring版本是3.2.10) 在xml文件中配置一个普通的bean,默认使用单例,创建该bean的调用栈如下: ClassPathXmlApplicationContext //Class ...

  7. splunk 通过rest http导入数据

    使用 HTTP Event Collector go to Settings > Data inputs > HTTP Event Collector. Then click the Gl ...

  8. qt +ChartDirector 绘制图表

    自从开发由c#转入Qt后一直寻找一款Qt下的图形控件库,最后ChartDirector控件映入眼球.ChartDirector控件使用方便,快捷,灵活,功能强大,交互性强.在web服务器以及嵌入式应用 ...

  9. Linux C ftruncate 函数清空文件注意事项(要使用 lseek 重置偏移量)

    转载:http://blog.csdn.net/a_ran/article/details/43562429 int truncate(const char *path, off_t length); ...

  10. TMemo Ctrl + A

    http://delphi.about.com/od/adptips2004/a/bltip0804_4.htm Here's how to implement the code for the CT ...