【问题描述】
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 <iostream>
#include<bits/stdc++.h>
using namespace std;
struct Team
{
string name;
int score=0;
int ncount=0;
int mcount=0;
};
bool cmp(Team a, Team b)
{
if (a.score==b.score)
{
if(a.ncount==b.ncount)
return a.mcount>b.mcount;
else
return a.ncount>b.ncount;
}
else
return a.score>b.score;
}
map<string,int>maps;
bool cmp1(Team a,Team b)
{
return maps[a.name]<maps[b.name];
}
int main()
{
int n;
cin>>n;
Team team[n];
for(int i=0;i<n;i++)
{
string str;
cin>>str;
team[i].name=str;
maps[str]=i;
}
int m=n*(n-1)/2;
for(int i=0;i<m;i++)
{
string team1,team2,vs,st;
char vt;
int score1,score2;
cin>>st>>score1>>vt>>score2;//A-B 3:2
stringstream ss(st);
string sub_str;
getline(ss,sub_str,'-');
team1=sub_str;
getline(ss,sub_str,'-');
team2=sub_str;
int n1=maps[team1],n2=maps[team2];
team[n1].mcount+=score1;
team[n2].mcount+=score2;
if(score1!=score2)
{
if(score1>score2)
{
team[n1].score+=3;
team[n1].ncount+=abs(score1-score2);
team[n2].ncount-=abs(score1-score2);
}
else
{
team[n2].score+=3;
team[n2].ncount+=abs(score1-score2);
team[n1].ncount-=abs(score1-score2);
}
}
else
{
team[n1].score+=1;
team[n2].score+=1;
}
}
sort(team,team+n,cmp);
for(int i=0;i<n/2;i++)
{
sort(team,team+n/2,cmp1);
cout<<team[i].name<<endl;
}
return 0;
}