PAT 乙级 1018 锤子剪刀布 (20分)---【map 字符与数字相关】

8 篇文章 0 订阅
6 篇文章 0 订阅


在这里插入图片描述
输入样例:

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:

	1.利用结构体设置两个变量,为甲、乙的手势
	2.输入甲乙手势
	3.记录甲赢输的次数(即对应乙输赢的次数)和平的次数
	4.利用map<char,int>分别存储甲乙使用'C','J','B'的所赢次数,键为字符,值为int次数。
	5.考虑甲乙所有输出可能,存储对应的甲赢,甲输,平的次数,以及每次各自赢的时候所使用的字符的次数。
	6.设置最大数次数临时变量max,用来找出最多赢得次数最多的对应字符。和设置临时字符变量,并初始化为B!!!!!(由int型值找字符型键)

代码1:

#include<bits/stdc++.h>
using namespace std;

struct Quan{
	char x;
	char y;
};

int main(){
	int n;
	cin>>n;
	Quan quan[n];
	for(int i = 0; i < n; i++){
		cin>>quan[i].x>>quan[i].y;
	}
	
	int x_ying=0;
	int x_shu=0;
	int ping=0;
	
	map<char,int>mp1,mp2;
	mp1['C']=0;//甲赢得比重 
	mp1['B']=0;
	mp1['J']=0;
	
	mp2['B']=0;//乙赢的比重 
	mp2['C']=0;
	mp2['J']=0;
	
	for(int i = 0; i < n; i++){
		if(quan[i].x=='C' && quan[i].y=='J'){
			x_ying++;
			mp1['C']++;
		}
		if(quan[i].x=='C' && quan[i].y=='B'){
			x_shu++;
			mp2['B']++;
		}
		if(quan[i].x=='J' && quan[i].y=='C'){
			x_shu++;
			mp2['C']++;
		}
		if(quan[i].x=='J' && quan[i].y=='B'){
			x_ying++;
			mp1['J']++;
		}
		if(quan[i].x=='B' && quan[i].y=='C'){
			x_ying++;
			mp1['B']++;
		}
		if(quan[i].x=='B' && quan[i].y=='J'){
			x_shu++;
			mp2['J']++;
		}
		if((quan[i].x=='C' && quan[i].y=='C') || (quan[i].x=='J' && quan[i].y=='J') || (quan[i].x=='B' && quan[i].y=='B')){
			ping++;
		}
	
	}
	cout<<x_ying<<" "<<ping<<" "<<x_shu<<endl;
	cout<<x_shu<<" "<<ping<<" "<<x_ying<<endl;
	
	map<char,int>::iterator it;
	int max1=0;
	char temp1='B';
	for(it=mp1.begin();it!=mp1.end();it++){
		 if(it->second>max1){
		 	max1=it->second;
		 	temp1=it->first;
		 }
	}
	cout<<temp1<<" ";
	

	int max2=0;
	char temp2='B';
	for(it=mp2.begin();it!=mp2.end();it++){
		if(it->second>max2){
		 	max2=it->second;
		 	temp2=it->first;
		 }
	}
	cout<<temp2;
	return 0;
} 

注意:

	1.查找最多次数对应的字符时,要分别设置两个最大值max=0,和两个临时字符变量,并且初始化一定为“B”
	(题目要求“如果解不唯一,则输出按字母序最小的解。”)
	2.迭代器可以只设置一个。	map<char,int>::iterator it;

思路2:

	1.与思路一不同的是不用map存储字符与对应的次数(一体)
	2.采用设置字符数组(按顺序存放字符)和存放次数的int数组,每次对应字符的次数加1,
	再遍历查找次数最大的下标,即就是输出对应的字符。(分成两部分)
		char str[3]={'B','C','J'};//0,1,2分别对应B,C,J(从小到大输出,题目中提示!)
		int x_cnt[3]={};//记录甲的str数组字符对应的次数
		int y_cnt[3]={};//记录乙的str数组字符对应的次数

代码2:

#include<bits/stdc++.h>
using namespace std;

struct Quan{
	char x;
	char y;
};

int main(){
	int n;
	cin>>n;
	Quan quan[n];
	
	for(int i = 0; i < n; i++){
		cin>>quan[i].x>>quan[i].y;
	}
	
	int x_res[3]={};//存储甲 赢(0)输(1)平(2) 的次数
	char str[3]={'B','C','J'};//0,1,2分别对应B,C,J(从小到大输出,题目中提示!)
	int x_cnt[3]={};//记录甲的str数组字符对应的次数
	int y_cnt[3]={};//记录乙的str数组字符对应的次数
	
	for(int i = 0; i < n; i++){
		
		if(quan[i].x=='C' && quan[i].y=='J'){
				x_res[0]++;
				x_cnt[1]++;
			}
			if(quan[i].x=='C' && quan[i].y=='B'){
				x_res[1]++;
				y_cnt[0]++;
			}
			if(quan[i].x=='J' && quan[i].y=='C'){
				x_res[1]++;
				y_cnt[1]++;
			}
			if(quan[i].x=='J' && quan[i].y=='B'){
				x_res[0]++;
				x_cnt[2]++;
			}
			if(quan[i].x=='B' && quan[i].y=='C'){
				x_res[0]++;
				x_cnt[0]++;
			}
			if(quan[i].x=='B' && quan[i].y=='J'){
				x_res[1]++;
				y_cnt[2]++;
			}
			if((quan[i].x=='C' && quan[i].y=='C') || (quan[i].x=='J' && quan[i].y=='J') || (quan[i].x=='B' && quan[i].y=='B')){
				x_res[2]++;
			}
	}
	cout<<x_res[0]<<" "<<x_res[2]<<" "<<x_res[1]<<endl;
	cout<<x_res[1]<<" "<<x_res[2]<<" "<<x_res[0]<<endl;
	
	//甲 
	int max1=0;//当成值 
	int temp=0;
	for(int i = 0; i < 3; i++){
		if(x_cnt[i]>max1){
			max1=x_cnt[i];
			temp=i;//记录第几个 
		}
	}
	//乙 
	int max2=0;//当成下标 
	for(int i = 0; i < 3; i++){
		if(y_cnt[i]>y_cnt[max2]){
			max2=i;//记录第几个 
		}
	}
	cout<<str[temp]<<" "<<str[max2];
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值