【问题描述】
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
#include
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
bool cmp1(Team a,Team b)
{
return maps[a.name] } int main() { int n; cin>>n; Team team[n]; for(int i=0;i { string str; cin>>str; team[i].name=str; maps[str]=i; } int m=n*(n-1)/2; for(int i=0;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 { sort(team,team+n/2,cmp1); cout< } return 0; }