CF100015A - Another Rock-Paper-Scissors Problem

来源:互联网 发布:菜鸟网络总部 编辑:程序博客网 时间:2024/06/06 18:02

题目大意:

小明的猜拳策略,先出R,然后每连续两段出拳策略是前一阶段的获胜方法。

样例:

R P S PSR SRP PSRSRPRPS SRPRPSPSR PSRSRPRPSSRPRPSPSRRPSPSRSRP....

第二个P可以赢第一个R,第三个S可以赢第二个P。接着的PSR可以赢前一阶段的RPS,SRP可以赢PSR。然后PSRSRPRPS可以赢R P S PSR SRPSRPRPSPSR可以赢PSRSRPRPS。以此类推。

求给定轮数胜利的策略。


通过观察可以发现,这个出拳策略和3有关(显然)。我们可以由3的次方数来分组,递归查找,出拳顺序的变换一定是S->P->R(每一次都要赢前一次的对应位置)。所以如果n是某个3的次方数的(1,2】倍之间,就需要往前推一个拳,如果是(2,3】之间,就需要往前推两个,然后去求n mod这个3的次方数的轮数即可。

#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cmath>using namespace std;long long n;long long fang[40];char ans[10];int main(){cin>>n;ans[1]='R';ans[2]='P';ans[3]='S';ans[4]='R';ans[5]='P';ans[6]='S';while(n){fang[0]=1;for(int i=1;i<=35;i++)fang[i]=fang[i-1]*3;int ji=35;int w=0;while(n>3){while(fang[ji]>=n)ji--;if(n<=2*fang[ji]){w++;n-=fang[ji];}else{w+=2;n-=2*fang[ji];}}w%=3;printf("%c\n",ans[n+w+1]);cin>>n;}return 0;}


0 0