weixin_75151975 2022-11-21 11:42 采纳率: 89.4%
浏览 91
已结题

求这个问题的完整代码

【问题描述】
在某场赛事中,有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分。
【输出】
按名次从前到后输出获奖队伍的名称。名次相同的队伍,按队名字典序顺序输出。

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2022-11-21 11:49
    关注

    这需要对每行的队伍名称和比分进行拆解,判断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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月29日
  • 已采纳回答 11月21日
  • 创建了问题 11月21日

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)