PAT-B 1018 錘子剪刀布 【模擬】

Enjoy_process發表於2019-02-19

                                               PAT-B 1018 錘子剪刀布 

                    https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344

 

題目

大家應該都會玩“錘子剪刀布”的遊戲:兩人同時給出手勢,勝負規則如圖所示:

FigCJB.jpg

現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。

輸入

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

分析

C 代表“錘子”、J 代表“剪刀”、B 代表“布”

C-C=0 平 
C-J=-7甲勝 
C-B=1  乙勝 

J-C=7 乙勝 
J-J=0 平 
J-B=8 甲勝 

B-C=-1 甲勝 
B-J=-8 乙勝 
B-B=0 平 

總結 平:0  甲勝:-1,-7,8 乙勝:1,7,-8。具體看程式。

 C++程式

#include<iostream>
#include<map> 

using namespace std;

map<char,int>m[2];//m[0]表示甲的情況,m[1]表示乙的情況。 
int ans[2][3];//ans[0]表示甲的勝、平、負的次數,ans[1]代表乙的情況

int main()
{
	int n;
	scanf("%d",&n);
	while(n--)
	{
		char c1,c2;
		scanf(" %c %c",&c1,&c2);
		int temp=c1-c2;
		if(temp==0)//平
		{
			ans[0][1]++;//甲平次數加一 
			ans[1][1]++;//乙平次數加一 
		}
		else if(temp==-1||temp==-7||temp==8)//甲勝
		{
			ans[0][0]++;//甲勝次數加一
			ans[1][2]++;//乙負次數加一 
			m[0][c1]++;//甲獲勝,出c1手勢的次數加一 
		} 
		else//乙勝 
		{
			ans[0][2]++;//甲負次數加一
			ans[1][0]++;//乙勝次數加一 
			m[1][c2]++;//乙獲勝,出c2手勢的次數加一  	
		}
	}
	printf("%d %d %d\n%d %d %d\n",ans[0][0],ans[0][1],ans[0][2],ans[1][0],ans[1][1],ans[1][2]);
	for(int i=0;i<2;i++)
	{
		int ch='B';
		if(m[i][ch]<m[i]['C'])
		  ch='C';
		if(m[i][ch]<m[i]['J'])
		  ch='J';
		if(i) printf(" ");
		printf("%c",ch);
	}
	printf("\n");
	return 0;
} 

 

相關文章