【问题描述】
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<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct team
{
int scores;
int jingshen;
int jingqiu;
string name;
};
bool cmp(team a,team b)
{
if(a.scores!=b.scores)
{
return a.scores>b.scores;
}
else if(a.jingshen!=b.jingshen)
{
return a.jingshen>b.jingshen;
}
else if(a.jingqiu!=b.jingqiu)
{
return a.jingqiu>b.jingqiu;
}
}
bool cmp1(team a,team b)
{
return a.name < b.name; //按字典序从小到大排列
}
int main()
{
int n;
cin>>n;
team match[n];
for(int i=0;i<n;i++)
{
cin>>match[i].name;
match[i].scores=0;
match[i].jingshen=0;
match[i].jingqiu=0;
}
int cishu=n*(n-1)/2;
string a[cishu],b[cishu];
for(int i=0;i<cishu;i++)
{
cin>>a[i]>>b[i];
}
for(int i=0;i<cishu;i++)
{
int j=0;
int k=0;
string x=a[i];
int m=x.find('-');
string xj=x.substr(0,m);
string xk=x.substr(m+1,x.length()-m-1);
string x2=b[i];
for(;j<n;j++)
{
if(xj==match[j].name)
break;
}
for(;k<n;k++)
{
if(xk==match[k].name)
break;
}
match[j].jingqiu+=(x2[0]-'0');
match[k].jingqiu+=(x2[2]-'0');
if((x2[0]-'0')>(x2[2]-'0'))
{
match[j].scores+=3;
}
if((x2[0]-'0')<(x2[2]-'0'))
{
match[k].scores+=3;
}
if((x2[0]-'0')==(x2[2]-'0'))
{
match[k].scores+=1;
match[j].scores+=1;
}
match[j].jingshen+=(x2[0]-'0')-(x2[2]-'0');
match[k].jingshen+=(x2[2]-'0')-(x2[0]-'0');
}
sort(match,match+n,cmp);
team list[n/2];
/*for(int i=0;i<n;i++)
{
cout<<match[i].name<<" "<<match[i].scores<<" "<<match[i].jingshen<<" "<<match[i].jingqiu<<endl;
}*/
for(int i=0;i<n/2;i++)
{
list[i].name=match[i].name;
}
sort(list,list+n/2,cmp1);
for(int i=0;i<n/2;i++)
{
cout<<list[i].name<<endl;
}
}