19:07:47 2019-04-02
问题 I: 锤子剪刀布 (20)
时间限制: 1 Sec 内存限制: 32 MB提交: 1249 解决: 504
[提交][状态][讨论版][命题人:外部导入]
题目描述
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入
输入第1行给出正整数N(<=105),即双方交锋的次数。随后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
补充一下知识:
结构体数组的排序
typedef struct js{
char c;
int w;
}js;
bool cmp(js a,js b){
return a.w<b.w; //将结构体按照w的大小 将它们从小到大排
}
sort(a,a+3,cmp);//结构体排序要加cmp否则会报错 这个函数在#include<algorithm>头文件中
出乎意料,这道题我竟写的挺复杂的!
说一下几个点:
1、站在赢方(甲)角度,其对应关系
甲 PK 乙
J B
B C
C J
这三种情况都是甲赢
2、关于甲赢、输、平次数——计数问题,一定是数组来存的!+题目要求在甲赢的情况中,出哪个拳是赢得最多的 => 一定是一个结构体 包含两个元素(一是哪个拳(J,B,C)二是这些拳赢得次数)
3、一旦甲解决了,那么乙同理,不过这里可以少一步就是=>1、甲输,必定乙赢,那么你在计甲赢的时候,就可以同时判断甲输的时候从而计乙赢的次数。2、甲输的次数==乙赢的次数
4、这是最重要的一步,很容易忽略(我就忘记这个结果报出:答案错误43%):题目要求:如果解不唯一,则输出按字母序最小的解。(我写的时候,就是这没看到,或者说做之前看到的,码着码着就忘了...)
这个怎么解决?
容易啊,既然我选择保存在一个结构体数组,还排了序,那就从后往前遍历呗,看前面的次数是不是和最后一个次数相同,如果相同还要比较一下字母序...功能实现是在char MinC(js a[]){}函数中
PS:感觉代码不够简洁,写复杂了点..有缘的时候再看看,说不定还是另外一份想法!
代码如下AC:
1 #include <iostream>
2 #include<algorithm>
3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
4 using namespace std;
5 //int a[3];//用于记录获胜次数 'C'为a[0] 'J'为a[1] 'B'为a[2]
6 /*
7 C代表“锤子”、J代表“剪刀”、B代表“布”
8 */
9 typedef struct js{
10 char c;
11 int w;
12 }js;
13 js a[3];
14 js b[3];
15 void Init_a(){
16 a[0].w=a[1].w=a[2].w=0;
17 a[0].c='C';
18 a[1].c='J';
19 a[2].c='B';
20 }
21
22 void Init_b(){
23 b[0].w=b[1].w=b[2].w=0;
24 b[0].c='J';
25 b[1].c='B';
26 b[2].c='C';
27 }
28 int judge(char f,char s){
29 // f为甲方 s为乙方
30 if(f==s) return 0;//表示平手
31 else{
32 switch(f){
33 case 'C':
34 if(s=='J'){ a[0].w++; return 1; }
35 else if(s=='B'){ b[1].w++; return -1;}//表示输了
36
37 case 'J':
38 if(s=='B'){ a[1].w++; return 1; }
39 else if(s=='C'){ b[2].w++; return -1;}//表示输了
40
41 case 'B':
42 if(s=='C') { a[2].w++; return 1; }
43 else if(s=='J'){ b[0].w++; return -1;}//表示输了
44
45 }
46 }
47
48 }
49 bool cmp(js a,js b){
50 return a.w<b.w;
51 }
52 //0表示平手,1表示甲方赢,-1表示甲方输
53 char MinC(js a[]){
54 int i;
55 int minc=a[2].c;
56 for(i=1;i>=0;i--){
57 if(a[2].w==a[i].w&&minc>a[i].c){
58 minc=a[i].c;
59 }
60 }
61 return minc;
62 }
63 int main(int argc, char** argv) {
64 int n;
65 int i;
66 int w,f,e;
67 char o,s;
68 while(cin>>n){
69 Init_a();
70 Init_b();
71 getchar();//这个一定要加
72 w=f=e=0;
73 while(n--){
74
75 cin>>o>>s;
76 int t=judge(o,s);
77 if(t==1)
78 w++;
79 if(t==-1)
80 f++;
81 if(t==0)
82 e++;
83 }
84 sort(a,a+3,cmp);//结构体排序要加cmp否则会报错
85 char _a=MinC(a);
86
87 sort(b,b+3,cmp);
88 char _b=MinC(b);
89
90 cout<<w<<" "<<e<<" "<<f<<endl;
91 cout<<f<<" "<<e<<" "<<w<<endl;
92 cout<<_a<<" "<<_b<<endl;
93
94 }
95
96 return 0;
97 }