练习八 结构体 编程题 5. 火星人足球赛

嘿嘿,嘿嘿,自己写出来啦,这道题好玩,嘿嘿,嘿嘿

【问题描述】

       火星人足球赛的比赛规则与地球人的比赛规则有些非常相似,比如严重犯规,将被给予黄牌警告,特别严重的犯规,将给予红牌直接罚下,如果有人得到第2张黄牌,则自动获得红牌罚下,比赛同样采取主客场制。

       与地球人足球赛不同的是,火星人足球赛每队可以上场的人数不会固定为11人,可以多个人,比赛时间也会更长一些。

       比赛时的裁判员是机器人,判罚非常严厉,如果有人获得红黄牌,机器人裁判将自动记录当时的情况。       

【输入形式】

       输入的第一行为主队队名,第二行为客队队名,队名的长度不超过20个字符。

       第三行为一个整数 n (0 ≤ n ≤ 90) ,表示得到红黄牌的犯规次数。

       接下来的n行,每行包含用空格分隔的4个部分,表示犯规的情况:

    • 首先为一个整数,表示犯规的时间(分钟)

    • 接着为一个字符"h"或"a",如果为"h",表示该张牌会给到主队球员,否则会给到客队球员

    • 接下来为球员编号m  (1 ≤ m ≤ 99)

    • 接下来为一个字符"y"或"r",如果为"y",表示为黄牌,否则为红牌

       不同球队的球员可能有相同的号码,在同一球队球员的号码不相同,犯规记录按时间顺序排列。

【输出形式】

       输出按时间顺序排列的获得红牌的记录,如果时间相同,则主队排在前面,如果同一时间同一球队有多人获得红牌,则编号大的排在前面。每个红牌一行,包含3个部分:球员所属球队的名字、犯规球员编号、获得红牌时间。

      如果全场比赛无红牌,输出"No Red Card"

#include<iostream>
#include<algorithm> 
using namespace std;
struct Warn{
	int time;
	char team;
	int num;
	char color; 
}; 
bool cmp(Warn x,Warn y){	
	if(x.time==y.time)	return x.team=='h'||(x.num>y.num&&(x.team==y.team));
	else return x.time<y.time;
}
int main(){
	string a,b;
	cin>>a>>b;
	int n;
	cin>>n;
	Warn* warn=new Warn[n];
	int tmp1[101]={};
	int tmp2[101]={};
	for(int i=0;i<n;i++){
		cin>>warn[i].time;
		cin>>warn[i].team;
		cin>>warn[i].num;
		cin>>warn[i].color;

		if(warn[i].color=='y'&&warn[i].team=='h'){
			tmp1[warn[i].num]++;
			if(tmp1[warn[i].num]==2){
				warn[i].color='r';
			}
		}
		if(warn[i].color=='y'&&warn[i].team=='a'){
			tmp2[warn[i].num]++;
			if(tmp2[warn[i].num]==2){
				warn[i].color='r';
			}
		}
	}
	//::如果有人得到第2张黄牌,则自动获得红牌罚下
    //输出按时间顺序排列的获得红牌的记录
	//::如果时间相同,则主队排在前面
	//::如果同一时间同一球队有多人获得红牌,则编号大的排在前面

    sort(warn,warn+n,cmp);
    bool bo=0;
    for(int i=0;i<n;i++){
    	if(warn[i].color=='r'){
    		bo=1;
    		if(warn[i].team=='h') cout<<a<<' ';
			else cout<<b<<' ';
			cout<<warn[i].num<<' '<<warn[i].time<<endl;
		}
	}
	if(bo==0)cout<<"No Red Card"<<endl;
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值