转跳点:

1018 锤子剪刀布 (20分)
 

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

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

输入格式:

输入第 1 行给出正整数 N(≤10​5​​),即双方交锋的次数。随后 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
  这道题不算难题,就是注意排序方式,考察了多组输入字符比较,没什么特别大的坑,就是个人感觉三目运算会更简单的解决三个数比大小的问题。注意考虑相等的情况。
我写了两个函数的三个数比较和宏定义的三目运算三位数比较,代码较长。

  非宏定义

  

 1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int compared(int a, int b, int c);
5
6 int main()
7 {
8 int n;
9 char TypeMap[] = {'J', 'C', 'B'};
10 int Awin = 0, Bwin = 0, Nwin = 0;
11 int BJ = 0, BC = 0, BB = 0, AJ = 0, AC = 0, AB = 0;
12 char A, B;
13
14 scanf("%d\n", &n);
15
16 //开始统计各种次数
17 while (n--)
18 {
19 scanf("%c %c", &A, &B);
20
21 //偷懒求了B C J差值
22 //A赢的情况8 ,-7, -1
23 //B赢的情况-8, 7, 1
24 switch (A - B)
25 {
26 case 0: //平局
27 Nwin++;
28 break;
29 case 8: //J - B
30 Awin++;
31 AJ++;
32 break;
33 case -7: //C - J
34 Awin++;
35 AC++;
36 break;
37 case -1: //B - C
38 Awin++;
39 AB++;
40 break;
41 case -8: //B - J, 从这里往下乙赢
42 Bwin++;
43 BJ++;
44 break;
45 case 7: //J - B
46 Bwin++;
47 BC++;
48 break;
49 case 1: //C - B
50 Bwin++;
51 BB++;
52 break;
53 }
54 getchar();
55 }
56
57 int BigA = compared(AJ, AC, AB);
58 int BigB = compared(BJ, BC, BB);
59
60 printf("%d %d %d\n", Awin, Nwin, Bwin);
61 printf("%d %d %d\n", Bwin, Nwin, Awin);
62 printf("%c %c\n", TypeMap[BigA], TypeMap[BigB]);
63 return 0;
64 }
65
66 //三个数比大小
67 int compared(int a, int b, int c)
68 {
69 if (a > b)
70 {
71 if (a > c)
72 {
73 return 0;
74 }
75 else
76 {
77 return 2;
78 }
79 }
80 else
81 {
82 if (b > c)
83 {
84 return 1;
85 }
86 else
87 {
88 return 2;
89 }
90 }
91 }

  三目运算

 1 #include <stdio.h>
2 #include <stdlib.h>
3
4 //三目运算三个数比大小
5 #define cmp(a, b, c) a > b ? (a > c ? 0 : 2) : (b > c ? 1 : 2);
6
7 int main()
8 {
9 int n;
10 char TypeMap[] = {'J', 'C', 'B'};
11 int Awin = 0, Bwin = 0, Nwin = 0;
12 int BJ = 0, BC = 0, BB = 0, AJ = 0, AC = 0, AB = 0;
13 char A, B;
14
15 scanf("%d\n", &n);
16
17 while (n--)
18 {
19 scanf("%c %c", &A, &B);
20
21 switch (A-B)
22 {
23 case 0:Nwin++;break;
24 case 8:Awin++;AJ++;break;
25 case -7:Awin++;AC++;break;
26 case -1:Awin++;AB++;break;
27 case -8:Bwin++;BJ++;break;
28 case 7:Bwin++;BC++;break;
29 case 1:Bwin++;BB++;break;
30 }
31 getchar();//吞回车
32 }
33
34 int BigA = cmp(AJ, AC, AB);
35 int BigB = cmp(BJ, BC, BB);
36
37 printf("%d %d %d\n", Awin, Nwin, Bwin);
38 printf("%d %d %d\n",Bwin, Nwin, Awin);
39 printf("%c %c\n", TypeMap[BigA], TypeMap[BigB]);
40 return 0;
41 }

内联三目

  不用宏也可以,直接写个函数也行,鬼知道,宏会不会被编译器优化

int cmp(char a, char b, char c) {return a > b ? (a > c ? 0 : 2) : (b > c ? 1 : 2);}

   喜欢哪个用哪个吧

  PAT不易,诸君共勉!

P1018 锤子剪刀布的更多相关文章

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

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

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

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

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

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

  4. PAT_1018 锤子剪刀布

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

  5. B1018. 锤子剪刀布

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

  6. PAT 1018 锤子剪刀布

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

  7. 牛客网 PAT 算法历年真题 1008 : 锤子剪刀布 (20)

    锤子剪刀布 (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 大家应该都会玩“锤子剪刀布”的游戏:现给出 ...

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

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

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

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

随机推荐

  1. C++ 定位错误行

    ] = {}; SYSTEMTIME st; GetLocalTime(&st); sprintf_s(buf, , "%02d-%02d-%02d %02d:%02d:%02d | ...

  2. 【攻防世界】 高手进阶区 Recho WP

    0x00 考察点 考察点有三个: ROP链构造 Got表劫持 pwntools的shutdown功能 0x01 程序分析 上来三板斧 file一下 checksec --file XXX chmod ...

  3. CBC加密原理及攻击

    原理基于分组加密加密过程 Plaintext:明文,待加密的数据.IV:用于随机化加密的比特块,保证即使对相同明文多次加密,也可以得到不同的密文,初始向量,用来与第一块的明文异或运算.Key:被一些如 ...

  4. Linux关于文件处理命令

    一.登陆用户和机器名称 示例:[root@hadoop01 ~]# root:表示用户名 @hadoop01表示机器名称 ~表示当前文件目录是家目录 #表示输入命令提示符,用户可以在其后输入命令:非r ...

  5. JAVA虚拟机:内存各个区介绍

    概述:java应用程序由java虚拟机自动管理程序执行期间内存管理. 优势:1.不再需要程序员去为使用的内存在程序中手动编写释放内存代码. 2.由虚拟机管理内存不容易出现内存泄漏和内存溢出的问题. 缺 ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:按钮标签

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 用 Weave Scope 监控集群【转】

    创建 Kubernetes 集群并部署容器化应用只是第一步.一旦集群运行起来,我们需要确保一起正常,所有必要组件就位并各司其职,有足够的资源满足应用的需求.Kubernetes 是一个复杂系统,运维团 ...

  8. 免费的 Linux 分区管理器使用介绍

    下面的列表没有特定的排名顺序.大多数分区工具应该存在于 Linux 发行版的仓库中. GParted 这可能是 Linux 发行版中最流行的基于 GUI 的分区管理器.你可能已在某些发行版中预装它.如 ...

  9. docker中使用mongodb

    连接mongodb容器,下拉alpine应用测试连接

  10. 百度小程序-接入自然搜索-API提交Url-c#开发

    开发百度小程序后,接下来,人们最想做的是让百度更多的录入自家内容.因为小程序资源被索引后,才可能在搜索结果中展现. 百度也提供了小程序的自然搜索提交入口.一共有两种方式: 第一种是用已有的H5网站资源 ...