1018 锤子剪刀布 (20)(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
题目大意: J吃B B吃C C吃J (说是剪刀布子锤,其实就是一个食物链?哈哈~) 问 A 赢了多少 B 赢了多少 平了多少 A人出什么赢得多 B人出什么赢得多。
说实话 我被最后一个答案错误搞得 最后发现是没有排序 == sort了一下 取了最大值对应的 char 返回就正确。
激动护体~
代码原理:
1.写一个判断谁输谁赢的函数
2.写一个出什么赢得多的函数。
3.写一个主函数 和一个解答solve函数
实现:
1.读入数据,使用容器A 保存A人赢的手势 使用容器B保存B人赢的手势
2.如果没有平局 那么最大的 手势就是 赢的多的手势 否则来一波if
3.再通过外部定义两个计数器进行计数 为了方便直观 我用了三个计数器 分别统计 A赢的次数 B赢的次数 AB平局的次数
最后格式输出就好。(不要cin>> cout<<这个有时候超时,这道题随意~~ 但是我害怕我不用~~);
AC代码:
#include <bits/stdc++.h>
using namespace std;
int pd(char x,char y) {
if (x == y)
return -1; // 平局
if ((x == 'C'&&y == 'J')||(x == 'J'&&y == 'B')||(x == 'B'&&y == 'C'))
return 1; // 甲赢
return 0; //乙赢
}
char outputpd(vector<char>ST) {
int C, J, B;
C = J = B = 0;
for (int i = 0; i < ST.size(); i++)
if (ST[i] == 'C') C++;
else if (ST[i] == 'J') J++;
else if (ST[i] == 'B') B++;
if ((C == B) && C > J) { // C B J CB CJ BJ
return 'B';
}
else if ((C == J) && C > B) {
return 'C';
}
else if ((B == J) && B > C) {
return 'B';
}
else if ((B == J) && (J == C)) {
return 'B';
}
pair<int, char>AX[3] = { {C,'C'},{B,'B'},{J,'J'} }; // 构造函数
sort(AX, AX + 3); // 排序
return AX[2].second;
}
void solve() {
// C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。
int x;
scanf("%d",&x);
int Acnt = 0, Bcnt = 0, ABcnt = 0;
vector<char>AS, BS;
for (int i = x; i--;) {
getchar();
char a, b;
scanf("%c %c", &a, &b);
int tn = pd(a, b);
if (tn == -1)
ABcnt++;
if (tn == 0)
Bcnt++, BS.push_back(b);
if (tn == 1)
Acnt++, AS.push_back(a);
}
printf("%d %d %d\n", Acnt, ABcnt, Bcnt);
printf("%d %d %d\n", Bcnt, ABcnt, Acnt);
printf("%c %c", outputpd(AS), outputpd(BS));
}
int main() {
solve();
return 0;
}