19:07:47 2019-04-02
问题 I: 锤子剪刀布 (20)
时间限制: 1 Sec 内存限制: 32 MB提交: 1249 解决: 504
[提交][状态][讨论版][命题人:外部导入]
题目描述
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入
输入第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
补充一下知识:
结构体数组的排序
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 }