题意



分析

考场做法同题解一样。

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. 手动添加 launcher 到 Ubuntu Unity

    本来,启动程序之后,在左边的launcher bar点右键,[Lock to Launcher]就可以的. 但是,有时候因为某种原因,需要手工添加. 这时候,就要参考下面的文章了 http://ask ...

  2. eclipse安装adt插件后工具栏不显示android相关图标

    到eclipse官网下载luna(开发android,推荐此版本,当前最新版4.4.2)版本的eclipse http://ftp.jaist.ac.jp/pub/eclipse/technology ...

  3. Django MySQL数据库操作

    上一篇文章写了一些基本的Django操作,下面重点介绍数据库的内容. 对象之间的关系: 一对一 一对多 多对多 1.一对多 先演示一对多的关系,多个blog对应一个名字, 修改blog/models. ...

  4. Python递归遍历《指定目录》下的所有《文件》

    https://www.cnblogs.com/dreamer-fish/p/3820625.html

  5. Educational Codeforces Round 57题解

    A.Find Divisible 沙比题 显然l和2*l可以直接满足条件. 代码 #include<iostream> #include<cctype> #include< ...

  6. TCP客户端与服务器的实现

    为了更容易理解,我们举一个小例子来说明服务器与客户端之间的连接过程. 有一个饭店,饭店里有服务员,服务员用于招待客人 特别要注意的是:要记住相关函数的各个参数都是什么,什么时候返回SOCKET_ERR ...

  7. EBS R12 MOAC原理探索 (转)

    转载地址 EBS R12 MOAC原理探索

  8. ES profile 性能优化用——返回各个shard的耗时

    Profile API 都说要致富先修路,要调优当然需要先监控啦,elasticsearch在很多层面都提供了stats方便你来监控调优,但是还不够,其实很多情况下查询速度慢很大一部分原因是糟糕的查询 ...

  9. 各种格式的压缩包解压,7zip 命令行

    由于7z.exe所在路径,以及解压目录中可能包含中文特殊字符,导致解压失败,所以最好将各部分路径使用双引号包含起来. 如:CString str; str.Format(L"\"% ...

  10. URAL 1934 最短路变形

    DES:给出起点和终点.给出所有小岛的编号.所有路径的起始点.和遇到怪物的概率.要求在最短路的条件下维护遇见怪物的概率最小的路径.就是用 SPFA算法.每条路的权值设为1.最短路即为途径的岛数最少.同 ...