6. 世界杯来了

【问题描述】

       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;
}

猜你喜欢

转载自blog.csdn.net/a45667/article/details/125463823