admin管理员组

文章数量:1621658

题目描述

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

输入格式

输入第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

个人代码:

#include<bits/stdc++.h>
using namespace std;
int change(char c)
{
	if(c=='B')
	return 0;
	if(c=='C')
	return 1;
	if(c=='J')
	return 2;
}
int main()
{
	int n,k1,k2;
	char c1,c2;
	int a[20]={0};
	int b[20]={0};
	int awin[10]={0};
	int bwin[10]={0}; 
	scanf("%d",&n);
	getchar();
	for(int i=1;i<=n;i++)
	{
		scanf("%c %c",&c1,&c2);
		getchar();
		k1=change(c1);
		k2=change(c2);
		if((k1+1)%3==k2)
		{
			a[0]++;
			b[2]++;
			awin[k1]++;
		}
		if(k1==k2)
		{
			a[1]++;
			b[1]++;
		}
		if((k2+1)%3==k1)
		{
			b[0]++;
			a[2]++;
			bwin[k2]++;
		}
	}
	printf("%d %d %d\n",a[0],a[1],a[2]);
	printf("%d %d %d\n",b[0],b[1],b[2]);
	int cwin=0;
	int dwin=0;
	int w1,w2;
	char mp[3]={'B','C','J'};
	for(int i=0;i<3;i++)
	{
		if(awin[i]>awin[cwin])
		{
			cwin=i;
		}
		if(bwin[i]>bwin[dwin])
		{
			dwin=i;
		}
	}
	printf("%c %c",mp[cwin],mp[dwin]);
 } 

分析:

输出要求是要输出甲乙两个人的胜负平局情况,所以先设定两个数组a[20],b[20]存储胜负平情况,a[0]表示胜利,a[1]表示平局,a[2]表示失败,如果甲胜利的话,就是a[0]++b[2]++,如果甲乙平局的话,就是a[1]++,b[1]++;如果乙胜利的话,b[2]++,a[0]++;其中a[0]表示的是胜利,a[1]表示的是平局,a[2]表示的是失败,每读入一组数据,就将数组信息变更,对于找胜率最高的情况,可以设置数组awin[]和bwin[],a[0]表示的是B获胜的情况,a[1]表示的是C获胜的情况,a[2]表示的是J获胜的情况,之后比较三个数组的值就好,为了方便一点,可以另外设置一个数组mp,用来存放B C J,方便输出结果。

注意:

数组有点多,有点乱,需要自己好好琢磨一下。
第一次测试点三没有通过,原因是找最大的情况的时候算法有点错误。已更正。

本文标签: 锤子剪刀中文BasicPAT