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;
}
test20181006 石头剪刀布的更多相关文章
- 原创:微信小程序源码解说:石头剪刀布(附源码下载)
我的博客:来源链接 昨天看有个石头剪刀布的练习,就拿出来做了一下,布局的代码浪费了很多时间,果然CSS这块的还不是很熟练,下面直接上图上代码了. JS: var numAi = 0 var timer ...
- 洛谷P1328 生活大爆炸版石头剪刀布——S.B.S.
题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...
- C# Winform学习--- 实现石头剪刀布的游戏
本文使用winform实现简单的石头剪刀布的游戏,主要实现,电脑随机出拳,玩家手动点击出拳:实现简易背景图片3秒切换:简易统计信息. 1.效果图 2.实现代码 新建一个windows窗体程序,用数字1 ...
- P1905生活大爆炸版 石头剪刀布
P1905生活大爆炸版 石头剪刀布 描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第 8 集中出现了一种石头 ...
- AC日记——石头剪刀布 openjudge 1.6 08
08:石头剪刀布 总时间限制: 1000ms 内存限制: 65536kB 描述 石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. 一天,小A和小B正好在 ...
- luogu1328[NOIP2014 T1]生活大爆炸版石头剪刀布
题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...
- [NOIP2014] 提高组 洛谷P1328 生活大爆炸版石头剪刀布
题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...
- NOIp 2014 #1 生活大爆炸版石头剪刀布 Label:模拟
题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...
- A:石头剪刀布
总时间限制: 1000ms 内存限制: 65536kB描述石头剪刀布是常见的猜拳游戏.石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.一天,小A和小B正好在玩石头剪刀布.已知他们的出拳 ...
随机推荐
- 170301、使用Spring AOP实现MySQL数据库读写分离案例分析
使用Spring AOP实现MySQL数据库读写分离案例分析 原创 2016-12-29 徐刘根 Java后端技术 一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案 ...
- 微信小程序自定义模态框(字体图标)
组件已经传到github,自行下载:https://github.com/JinZhenZon/miniapp-customModel 支持如下配置: { outWidth <number&g ...
- Leetcode 96
class Solution { public: int numTrees(int n) { ]; dp[] = ; dp[] = ; dp[] = ; ;i <= n;i++){ ; ;j & ...
- dp练习(1)——马走日字
3328: 马走日字 时间限制: 1 Sec 内存限制: 128 MB提交: 35 解决: 5[提交][状态][讨论版] 题目描述 一次外出旅游,你路上遇到了一个骑着马的强盗,你很害怕,你需要找一 ...
- Oracle 使用GSON库解析复杂json串
在前文中讲到了如何使用JSON标准库解析json串,参考: Oracle解析复杂json的方法(转) 现补充一篇使用GSON库在Oracle中解析复杂json的方法. GSON串的使用教程参考官方文档 ...
- canvas绘制直线
HTML5 <canvas>元素用于图形的绘制,该元素只是图形容器,必须使用javascript脚本绘制图形创建一个画布:<canvas id="myCanvas" ...
- Openwrt TF Card Auto Mount&Check (4)
1 Scope of Document This document describes tf card bootup auto do file system check when mount ...
- CDMA学习
1.关于RC:http://www.mscbsc.com/askpro/question74915 2.CDMA知识要点:http://wenku.baidu.com/view/d4511442a89 ...
- scroll事件的优化以及scrollTop的兼容性
scrollTop的兼容性 scroll事件,当用户滚动带滚动条的元素中的内容时,在该元素上面触发.<body>元素中包含所加载页面的滚动条. 虽然scroll事件是在window对象上发 ...
- 利用 gulp 来合并seajs 的项目
gulp-seajs-transport 和 gulp-seajs-concat这两个gulp插件 gulp-seajs-transpor 这个插件这样是给每个js模块 标示 模块名称 gulp-se ...