题意

Sonny出石头剪刀布的猜拳策略是 先出R,然后每连续两段都是打败前一段的出拳, 现在问你第n回合打败他要出什么。

分析

他的策略 R P S PSR  SRP PSRSRPRPS SRPRPSPSR … …
打败他的策略是 P S R SRP  RPS SRPRPSPSR RPRPSRSRP … …
一套策略 1 1 1  3 3 9 9  … …
第几轮 1 2 3 4-6  7-9  10-18 19-27 … …

如果n是介于3的某个次方的(1,2]倍,那就是n要打败 n减去这个次方 对应的拳,故+1(对应的是P就变成S,S就变成R,R就变成P)

如果是(2,3]倍,那就+2(P变成R,R变成S,S变成P)。

而我们要知道 n减去这个次方 对应的拳,就用递归去求了。

可以用数组储存3的次方,数据范围n<=10^12,log310^12=25.15...,所以只要求到3的25次方即可。

代码

  1. #include<stdio.h>
  2. long long n,t[]={};
  3. char s[]="RPS";
  4. int main(){
  5. for(int i=;i<=;i++)
  6. t[i]=t[i-]*;
  7. while(scanf("%I64d",&n)&&n){
  8. int i=,a=;
  9. while(n>){
  10. while(n<=t[i])i--;
  11. while(n>t[i]){
  12. n-=t[i];
  13. a++;//推的次数
  14. }
  15. }
  16. printf("%c\n",s[(n+a)%]);
  17. //n为1 2 3,对应PSR
  18. //a为推的次数
  19. //(n+a)mod 3为对应的拳
  20. // 0对应R,1对应P,2对应S
  21. }
  22. return ;
  23. }

也可以用数学函数,我刚开始就是这样做,但是因为没有round,有误差,就WA了

  1. #include <stdio.h>
  2. #include <cmath>
  3. #define ll long long
  4. ll n,t,a;
  5. char s[]="RPS";
  6. int main()
  7. {
  8. while(~scanf("%I64d",&n)&&n)
  9. {
  10. a=;
  11. t=(ll)round(pow(,floor(log(n)/log())));
  12. //t为小于等于n的最大的3的次方,用round四舍五入取整防止误差
  13. if(n==t)t/=;
  14. //我们要求的是小于n的最大的3的次方,故t等于n时,t取再小一点的3的次方
  15. while(n>t&&t>)
  16. {
  17. n-=t;
  18. t=(ll)round(pow(,floor(log(n)/log())));
  19. if(n==t)t/=;
  20. a++;
  21. }
  22. printf("%c",s[(n+a)%]);
  23. }
  24. return ;
  25. }

【Gym 100015A】Another Rock-Paper-Scissors Problem的更多相关文章

  1. 【题解】CF1426E Rock, Paper, Scissors

    题目戳我 \(\text{Solution:}\) 考虑第二问,赢的局数最小,即输和平的局数最多. 考虑网络流,\(1,2,3\)表示\(Alice\)选择的三种可能性,\(4,5,6\)同理. 它们 ...

  2. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)

    2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...

  3. 【codeforces 527A】Playing with Paper

    [题目链接]:http://codeforces.com/contest/527/problem/A [题意] 让你每次从一个长方形里面截出一个边长为长方形的较短边的正方形; 然后留下的部分重复上述步 ...

  4. 【线段树】HDU 5443 The Water Problem

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5443 题目大意: T组数据.n个值,m个询问,求区间l到r里的最大值.(n,m<=1000) ...

  5. 【期望DP】BZOJ2318-[Spoj4060]Game with probability Problem

    [题目大意] Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币 ...

  6. 【codeforces 761D】Dasha and Very Difficult Problem

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  7. Gym - 101667H - Rock Paper Scissors FFT 求区间相同个数

    Gym - 101667H:https://vjudge.net/problem/Gym-101667H 参考:https://blog.csdn.net/weixin_37517391/articl ...

  8. FFT(Rock Paper Scissors Gym - 101667H)

    题目链接:https://vjudge.net/problem/Gym-101667H 题目大意:首先给你两个字符串,R代表石头,P代表布,S代表剪刀,第一个字符串代表第一个人每一次出的类型,第二个字 ...

  9. 【 Gym 101116K 】Mixing Bowls(dfs)

    BUPT2017 wintertraining(15) #4H Gym - 101116K 题意 给定一个菜谱,大写的单词代表混合物,小写的代表基础原料.每个混合物由其它混合物或基础原料组成,不会间接 ...

随机推荐

  1. UESTC 886 方老师金币堆 --合并石子DP

    环状合并石子问题. 环状无非是第n个要和第1个相邻.可以复制该行石子到原来那行的右边即可达到目的. 定义:dp[i][j]代表从第i堆合并至第j堆所要消耗的最小体力. 转移方程:dp[i][j]=mi ...

  2. Codeforces Round #274 Div.1 C Riding in a Lift --DP

    题意:给定n个楼层,初始在a层,b层不可停留,每次选一个楼层x,当|x-now| < |x-b| 且 x != now 时可达(now表示当前位置),此时记录下x到序列中,走k步,最后问有多少种 ...

  3. 在WPF控件上添加Windows窗口式调整大小行为

    起因 项目上需要对Canvas中的控件添加调整大小功能,即能在控件的四个角和四条边上可进行相应的拖动,类似Windows窗口那种.于是在参考以前同事写的代码基础上,完成了该功能. 代码实现 Adorn ...

  4. Maya FEM节点框架完成

    这几天把物理模拟框架移植到maya之中了. maya编程有一点比较关键,就是要让自己的程序逻辑适应maya的节点求值机制.在物理模拟中,往往需要进行时间积分,对此我的解决办法是,写一个节点rigSim ...

  5. 使用EXISTS语句注意点

    1.使用EXISTS语句,其目标列一般用“*”,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义. 2.使用EXISTS语句一定要注意上下两个表之间要建立联系. 例如,查询所有选修了1号 ...

  6. Spring 4 bak

    IOC (参考<Spring企业开发>.<Spring实战 第三版  第四版>) IoC概述 1.           控制反转 2.依赖注入   控制反转:大多数情况下,想要 ...

  7. 【转】【WPF】WriteableBitmap应用及图片数据格式转换

    使用 WriteableBitmap 类基于每个框架来更新和呈现位图.这对于生成算法内容(如分形图像)和数据可视化(如音乐可视化工具)很有用. WriteableBitmap 类使用两个缓冲区.“后台 ...

  8. ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法

    今天在使用多字段去重时,由于某些字段有多种可能性,只需根据部分字段进行去重,在网上看到了rownumber() over(partition by col1 order by col2)去重的方法,很 ...

  9. 用 eric6 与 PyQt5 实现python的极速GUI编程(系列02)---- 省市县(区)下拉列表多级联动

    [概览] 本文实现如下的程序: 主要步骤如下: 1.在eric6中新建项目,新建窗体 2.(自动打开)进入PyQt5 Desinger,编辑图形界面,保存 3.回到eric 6,对上一步得到的界面文件 ...

  10. 信息安全系统设计基础实验一:Linux开发环境的配置和使用(20135234,20135229)

    http://www.cnblogs.com/mqy123/p/4968386.html