求这个问题的完整代码

【问题描述】
在某场赛事中,有n支队伍进行循环赛,即任意两支队之间都要进行一场比赛。名次在n/2(含)以内的队伍可以获奖。名次按照积分和净得分从1开始依次往后排。积分多的队伍名次靠前,如果积分相同,则净得分多的名次靠前,如果净得分仍然相同,则名次相同。如果某个名次有多支队伍(例如x支),则将跳过后续的x-1个名次再继续排名。
积分规则为:获胜一场积3分,平局积1分,输不积分。净得分为总得分-总失分。
【输入】
第一行一个整数n(2<=n<=1000,n为偶数),表示队伍数量;随后n行,每行表示一支队伍的名称(队名包含字母数字和空格这几种字符,长度不超过50个字符);再随后n(n-1)/2行,每行的格式为name1-name2: score1-score2表示两队比赛得分。其中在“:”“-”前后可能存在若干空格。每场得分不超过100分。
【输出】
按名次从前到后输出获奖队伍的名称。名次相同的队伍,按队名字典序顺序输出。

这需要对每行的队伍名称和比分进行拆解,判断name1和name2哪个队伍,根据比分计算积分,最后进行排序和名次

img

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _team
{
    char name[20];
    int allscore;
    int winscore;
}team;

int find(team *teams,int n,char *t)
{
    for(int i=0;i<n;i++)
        if(strcmp(t,teams[i].name) == 0)
            return i;
    return -1;
}

int main()
{
    team teams[1000];
    int n,games=0,j=0;
    char info[50] = {0};
    char t1[20],t2[20];
    int s = 0;
    int score1,score2;
    scanf("%d",&n);
    games = n*(n-1)/2;
    for(int i=0;i<n;i++)
    {
        scanf("%s",teams[i].name);
        teams[i].allscore = 0;
        teams[i].winscore = 0;
    }
    getchar();
    for(int i=0;i<games;i++)
    {
        scanf("%[^\n]",info );
        getchar();
        char *tokenPtr=strtok(info," :-");
        s= 0;
        while(tokenPtr!=NULL)
        {
            switch(s++)
            {
            case 0:
                strcpy(t1,tokenPtr);
                break;
            case 1:
                strcpy(t2,tokenPtr);
                break;
            case 2:
                score1 = atoi(tokenPtr);
                break;
            case 3:
                score2 = atoi(tokenPtr);
                break;
            }
            tokenPtr=strtok(NULL," :-");
        }
        //
        if(score1 == score2)
        {
            teams[find(teams,n,t1)].allscore += 1;
            teams[find(teams,n,t2)].allscore += 1;
        }
        else if(score1 < score2)
        {
            teams[find(teams,n,t2)].allscore += 3;
            teams[find(teams,n,t1)].winscore += score1 - score2;
            teams[find(teams,n,t2)].winscore += score2 - score1;
        }
        else
        {
            teams[find(teams,n,t1)].allscore += 3;
            teams[find(teams,n,t1)].winscore += score1 - score2;
            teams[find(teams,n,t2)].winscore += score2 - score1;
        }
    }
    for(int i=0;i<n-1;i++)
        for(int j=0;j<n-i-1;j++)
        {
            if((teams[j].allscore < teams[j+1].allscore) || 
                ((teams[j].allscore == teams[j+1].allscore) && (teams[j].winscore > teams[j+1].winscore)) ||
                    ((teams[j].allscore == teams[j+1].allscore) && (teams[j].winscore == teams[j+1].winscore) && strcmp(teams[j].name,teams[j+1].name) > 0))
            {
                team t = teams[j];
                teams[j] = teams[j+1];
                teams[j+1] = t;
            }
        }
    int idx=1;
    for(int i=0;i<n;i++)
    {    
        if(i!=0)
        {
            if(teams[i].allscore != teams[i-1].allscore || teams[i].winscore != teams[i-1].winscore)
                idx++;
        }
        if(idx <= n/2)
            printf("%s\n",teams[i].name);
        else
            break;
    }
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632