admin管理员组

文章数量:1621658

记做题时犯的错
题目地址:https://pintia/problem-sets/994805260223102976/problems/994805304020025344

题目描述

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

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

输入格式

输入第 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.每次输入当前手势时,使用对应变量存储甲乙获胜或平局次数
2.使用两个数组分别记录甲、乙的3种获胜手势的次数
算法笔记做法:
将B、C、J对应为0、1、2,作为一维数组mp的三个元素,同时用一个函数将手势对应到数字
将甲乙手势c1和c2转换为数字k1和k2,判断k1胜k2条件为(k1 + 1) % 3 == k2,k1平k2条件为k1 == k2,k1胜k2条件为(k2 + k1) % 3 == k1

出错点

1.在使用scanf输入%c时会将\n读入,故需在后面加入getchar()吸收,以免数据读入出现错误
2.在写代码的时候打算直接使用if语句判断,刚开始使用
if(a[0] >= a[1] && a[0] >= a[2]) printf("B "); else if(a[1] >= a[2] && a[1] > a[0]) printf("C "); else printf("J ");来判断获胜次数最多的手势。
经检查后发现,提交时发现把‘&&’写成了‘||’。

代码

#include <iostream>

using namespace std; 

int main() {
	int n,i;
	scanf("%d",&n);
	getchar();
	int a[3] = {0};int b[3] = {0};  //存储甲乙获胜手势的次数
	int awin,bwin,afail,bfail,equal;//存储甲乙胜利、平局和失败的次数
	awin = bwin = afail = bfail = equal = 0;
	char anow,bnow;//存储甲乙目前的手势
	for(i = 0;i < n;i ++)
	{
		scanf("%c %c",&anow,&bnow);
		getchar();
		if(anow == bnow)
		    equal ++;
		else if((anow == 'C' && bnow == 'J') || (anow == 'J' && bnow == 'B') || (anow == 'B' && bnow == 'C'))
		{
			awin ++;
			bfail ++;
			if(anow == 'C') a[1] ++;
			if(anow == 'J') a[2] ++;
			if(anow == 'B') a[0] ++;
		}
		else
		{
			bwin ++;
			afail ++;
			if(bnow == 'C') b[1] ++;
			if(bnow == 'J') b[2] ++;
			if(bnow == 'B') b[0] ++;
		}
	} 
	printf("%d %d %d\n",awin,equal,afail);
	printf("%d %d %d\n",bwin,equal,bfail);
	int max_a = 0,max_b = 0;
	for (i = 0;i < 3;i ++)
	{
		if(a[i] > a[max_a]) max_a = i;
		if(b[i] > b[max_b]) max_b = i;
	}
	char max1,max2;
	if(max_a == 0) max1 = 'B';
	else if(max_a == 1) max1 = 'C';
	else max1 = 'J';
	if(max_b == 0) max2 = 'B';
	else if(max_b == 1) max2 = 'C';
	else max2 = 'J';
	printf("%c %C\n",max1,max2);
	return 0;
}

本文标签: 锤子剪刀LevelBasicPAT