一、问题定义

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如下:

        剪刀 > 布, 锤子 > 剪刀, 布 > 锤子

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

      输入格式:
       输入第 1 行给出正整数 N(≤),即双方交锋的次数。随后 N 行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C 代表“锤子”、J 代表“剪刀”、B 代表“布”,第 1 个字母代表甲方,第 2 个代表乙方,中间有 1 个空格。

      输出格式:
       输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。

      输入样例:
       10
       C J
       J B
       C B
       B B
       B C
       C C
       C B
       J B
       B C
       J J

       输出样例:
       5 3 2
       2 3 5
       B B

二、解题

python:最后一例超时

def jCB(a, b):
if a == b:
return states[2]
else:
return Table[(a, b)] def sucessGeture(suc):
max_cnt = max(list(suc.values()))
max_gess = [key for key in suc.keys() if suc[key] == max_cnt]
return sorted(max_gess)[0] def myPrint(array):
print("{} {} {}".format(array[0], array[1], array[2])) cnt = input()
Alpha = [0, 0, 0] # 甲乙
Beta = [0, 0, 0]
Suc_Alpha = {ges:0 for ges in ["J", "C", "B"]} # count the succeed hand
Suc_Beta = {ges:0 for ges in ["J", "C", "B"]} states = [(1, -1), (-1, 1), (0, 0)] # >, <, =
Table = { ("C", "J"):states[0], ("C", "B"):states[1],
("J", "C"):states[1], ("B", "C"):states[0],
("B", "J"):states[1], ("J", "B"):states[0]} for j in range(int(cnt)):
Gestures = input()
A, B = Gestures[0], Gestures[2]
Ans_a, Ans_b = jCB(A, B)[0], jCB(A, B)[1] # 1 0 -1
if Ans_a == 1:
Alpha[0] += 1 # succeed
Beta[2] += 1
Suc_Alpha[A] += 1 # count success gesture
elif Ans_b == 1:
Beta[0] += 1 # failed
Alpha[2] += 1
Suc_Beta[B] += 1
elif Ans_a == 0: # equal
Alpha[1] += 1
Beta[1] += 1 myPrint(Alpha)
myPrint(Beta)
print(sucessGeture(Suc_Alpha), sucessGeture(Suc_Beta))

C++

#include <iostream>
using namespace std; int count(char *JCB, char hand_chr)
{
int length = 3;
for ( int i = 0; i < length; i++) {
if (JCB[i] == hand_chr) {
return i;
}
}
} int findMax(int *suc)
{ // linear search
int max = suc[0];
for (int i = 1; i < 3; i++) {
if (max < suc[i]) {
max = suc[i];
}
}
return max;
} char findMinChr(char *max_chrs, int max_cnt)
{ // find min_chr in max_chrs
if (max_cnt == 0) {
return 'B';
} else {
char min_chr = max_chrs[0];
for (int i = 1; i < max_cnt ; i++) {
if (min_chr > max_chrs[i]) {
min_chr = max_chrs[i];
}
}
return min_chr;
}
}
int main(int argc, char *argv[])
{
int N, max_A, max_B, max_cnt= 0;
char max_chrs[3];
char max_chr_A, max_chr_B = ' '; int cnt_A[3] = {0, 0, 0};
int cnt_B[3] = {0, 0, 0};
int suc_A[3] = {0, 0, 0};
int suc_B[3] = {0, 0, 0}; char JCB[3] = {'J', 'C', 'B'};
char A, B = ' ';
cin >> N; //cout << N << "\n"; // C J B
for (int i = 0; i < N; i++) {
cin >> A >> B; //cout << A << " " << B << "\n";
if (A == B) {
cnt_A[1] += 1;
cnt_B[1] += 1;
} else if ((A == 'C' && B == 'J') ||
(A == 'J' && B == 'B') ||
(A == 'B' && B == 'C')) {
cnt_A[0] += 1;
cnt_B[2] += 1;
suc_A[count(JCB, A)] += 1; // succeed count } else if ((A == 'C' && B == 'B') ||
(A == 'J' && B == 'C') ||
(A == 'B' && B == 'J')) {
cnt_A[2] += 1;
cnt_B[0] += 1;
suc_B[count(JCB, B)] += 1;
}
} cout << cnt_A[0] << " " << cnt_A[1] << " " << cnt_A[2] << "\n";
cout << cnt_B[0] << " " << cnt_B[1] << " " << cnt_B[2] << "\n"; max_A = findMax(suc_A);
max_B = findMax(suc_B);
// 有重复代码
for (int i, j = 0; i < 3; i++) {
if (suc_A[i] == max_A) {
max_chrs[j] = JCB[i];
j++;
max_cnt++;
}
}
max_chr_A = findMinChr(max_chrs, max_cnt); max_cnt = 0;
for (int i, j = 0; i < 3; i++) {
if (suc_B[i] == max_B) {
max_chrs[j] = JCB[i];
j++;
max_cnt++;
}
}
max_chr_B = findMinChr(max_chrs, max_cnt);
cout << max_chr_A << " " << max_chr_B;
return 0;
}

PTA(BasicLevel)-1018 锤子剪刀布的更多相关文章

  1. PAT乙级 1018. 锤子剪刀布 (20)

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  2. PAT-乙级-1018. 锤子剪刀布 (20)

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  3. PAT 乙级 1018 锤子剪刀布 (20) C++版

    1018. 锤子剪刀布 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游 ...

  4. PAT 1018 锤子剪刀布(20)

    1018 锤子剪刀布 (20)(20 分) 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方 ...

  5. 【PAT】1018 锤子剪刀布 (20)(20 分)

    1018 锤子剪刀布 (20)(20 分) 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算 ...

  6. PAT(B) 1018 锤子剪刀布(C:20分,Java:18分)

    题目链接:1018 锤子剪刀布 分析 用一个二维数组保存两人所有回合的手势 甲乙的胜,平,负的次数刚好相反,用3个变量表示就可以 手势单独保存在signs[3]中,注意顺序.题目原文:如果解不唯一,则 ...

  7. PAT (Basic Level) Practise (中文)- 1018. 锤子剪刀布 (20)

    http://www.patest.cn/contests/pat-b-practise/1018 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统 ...

  8. PAT (Basic Level) Practise:1018. 锤子剪刀布

    [题目链接] 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行 ...

  9. PAT 1018 锤子剪刀布

    https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344 大家应该都会玩“锤子剪刀布”的游戏:两人同时 ...

随机推荐

  1. petite-vue源码剖析-沙箱模型

    在解析v-if和v-for等指令时我们会看到通过evaluate执行指令值中的JavaScript表达式,而且能够读取当前作用域上的属性.而evaluate的实现如下: const evalCache ...

  2. Redis 内存满了怎么办?这样设置才正确!

    上回在<Redis 数据过期了会被立马删除么?>说到如果过期的数据太多,定时删除无法删除完全(每次删除完过期的 key 还是超过 25%),同时这些 key 再也不会被客户端请求,就无法走 ...

  3. 《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)

    1.简介 上一篇宏哥用PageFactory实现了POM,宏哥再介绍一下如果不用PageFactory如何实现POM. 2.项目实战 在这里宏哥以百度首页登录的例子,如果用POM实现,在测试脚本中实际 ...

  4. redis:缓存穿透、缓存击穿、缓存雪崩

    缓存穿透的解决方案(空标记) 缓存穿透是指,在数据存储系统中不存在的记录,不会被存储到缓存中.这种记录每次的查询流量都会穿透到数据存储层.在高流量的场景下,不断查询空结果会大量消耗数据查询服务的资源, ...

  5. XCTF练习题---MISC---normal_png

    XCTF练习题---MISC---normal_png flag:flag{B8B68DD7007B1E406F3DF624440D31E0} 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是 ...

  6. XCTF练习题---MISC---Training-Stegano-1

    XCTF练习题---MISC---Training-Stegano-1 flag:steganoI 解题步骤: 1.观察题目,下载附件 2.打开下载的图片文件,发现就是一个点,修改文件扩展名,还是说查 ...

  7. 从 jQuery 到 Vue3 的快捷通道

    当初使用 jQuery 做了几个简单的项目,算是有一点点了解,现在学习Vue3,发现了一个可以快速转换思维的通道 -- 使用CDN的方式模拟 Vite 建立的项目! CDN方式 jQuery的使用非常 ...

  8. 【python疫情可视化】用pyecharts开发全国疫情动态地图,效果酷炫!

    一.效果演示 我用python开发了一个动态疫情地图,首先看下效果: 如图所示,地图根据实时数据通过时间线轮播的方式,动态展示数据的变化.随着时间的推移,疫情确诊数量的增多,地图各个省份颜色逐渐加深, ...

  9. 手脱UPX(3.91)

    1.使用Detect It Easy进行查壳: 2.使用x32dbg打开该带壳程序,在选项->选项->异常中添加区间设置0~FFFFFFFF全忽略: 3.我们F9运行到程序入口处,看到了p ...

  10. 一些GIT操作的技巧

    一.git stash 我们有时会遇到这样的情况,正在分支a上开发一半,然后分支b上发现Bug,需要马上处理.这时候分支a上的修改怎么办呢,git add 是不行的,有的git客户端版本会提示还有ad ...