问题描述】
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];
}