6.世界杯来了——ccf

问题描述】

       2018年俄罗斯世界杯结束了,法国获得冠军,全世界球迷度过了一个非常愉快的夏天。作为中国球迷,不能总是看别人踢球,这不福利来了,根据FIFA(国际足联)及全体成员协会的一致决定,2118年世界杯将在中国举办,作为东道主,中国队将无需参加预选赛而直接参加决赛阶段的比赛。

   比赛规则如下:

  • 总共n(n为偶数)个球队参加比赛

  • 按照分组赛积分排名,前n/2的球队进入淘汰赛

  • 积分排名的规则如下:球队获胜得3分,平局得1分,失利得0分,按照积分递减、净胜球递减以及进球数递减方式排名

    编写一个程序,根据给出的参赛队伍名单和所有比赛的结果,找出成功进入淘汰赛阶段的球队名单。

【输入形式】

       第一行输入包含唯一整数n(1<=n<=50),参加世界杯决赛的球队数量。接下来的n行是各球队的名字,为长度不超过30个字符的英文字符。接下来的n*(n-1)/2行,每行格式name1-name2 num1:num2(0<=num1, num2<=100),表示对阵球队及比分. 

【输出形式】

       输入n/2行,表示进入淘汰赛阶段的球队,按照字典序进行排列,每个球队名字占一行。
【样例输入】

4
A
B
C
D
A-B 1:1
A-C 2:2
A-D 1:0
B-C 1:0
B-D 0:3
C-D 0:3

【样例输出】

A
D

#include<bits/stdc++.h>
using namespace std;//substr(pos,len)-复制子字符串
struct compa {
	int score=0;//积分
	string name;
	int ballsum=0;//净进球数
	int ball=0;//进球数
};
bool cmp1(compa,compa);//用于正常赛事排序
bool cmp2(compa,compa);//用于字典序排序
int findchar(char,string);//找到-的位置
int main() {
	int n;//球队数量
	cin>>n;
	compa team[n];//结构体数组存储各球队信息
	for(int i=0; i<n; i++) {
		cin>>team[i].name;
	}
	for(int j=0; j<n*(n-1)/2; j++) {
		string str;
		int score1,score2;//代表进球数
		char a;//这里是字符 :
		char b='-';
		cin>>str>>score1>>a>>score2;
		int key=findchar(b,str);
		string name1,name2;
		name1=str.substr(0,key);//将两队的名字提取出来
		name2=str.substr(key+1,str.size());
		int flag=score1-score2;//主队净进球数
		for(int i2=0; i2<n; i2++) {//这个循环计算各队进球数
			if(team[i2].name==name1) {
				team[i2].ball+=score1;
			}
			if(team[i2].name==name2) {
				team[i2].ball+=score2;
			}
		}
		for(int i1=0; i1<n; i1++) {//这个循环将净胜和积分计算
			if(flag==0) { //打成平手
				if(team[i1].name==name1||team[i1].name==name2) {
					team[i1].score+=1;//各加一分
				}
			} else { //不是平手
				if(flag>0) { //name1赢
					if(team[i1].name==name1) {
						team[i1].score+=3;
						team[i1].ballsum+=flag;
					}
					if(team[i1].name==name2) {
						team[i1].score+=0;
						team[i1].ballsum+=score2-score1;
					}
				}
				if(flag<0) { //name2赢
					if(team[i1].name==name1) {
						team[i1].score+=0;
						team[i1].ballsum+=flag;
					}
					if(team[i1].name==name2) {
						team[i1].score+=3;
						team[i1].ballsum+=score2-score1;
					}
				}
			}
		}
		//以上两个if-else语句将每一次输入的球队信息进行分类录入team中,接下来进行按要求排序即可
	}
	sort(team,team+n,cmp1);
	sort(team,team+n/2,cmp2);
	for(int j2=0; j2<n/2; j2++)
          cout<<team[j2].name<<endl;
	}
int findchar(char a,string str1) {
	for(int i=0; i<str1.size(); i++)
		if(str1[i]==a)return i;
}
int finds(string str,compa s[],int leng) {
	for(int i=0; i<leng; i++)
		if(s[i].name==str)return i;
	return -1;
}
bool cmp1(compa a,compa b) {
	if(a.score!=b.score)return a.score>b.score;
	if(a.ballsum!=b.ballsum)return a.ballsum>b.ballsum;
	return a.ball>b.ball;
}
bool cmp2(compa x,compa y) {
	return x.name[0]<y.name[0];
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值