【问题描述】
在某场赛事中,有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分。
【输出】
按名次从前到后输出获奖队伍的名称。名次相同的队伍,按队名字典序顺序输出。
求这个问题的完整代码
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- CSDN专家-link 2022-11-21 11:49关注
这需要对每行的队伍名称和比分进行拆解,判断name1和name2哪个队伍,根据比分计算积分,最后进行排序和名次
#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; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥15 公交车和无人机协同运输
- ¥15 stm32代码移植没反应
- ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
- ¥100 连续两帧图像高速减法
- ¥15 组策略中的计算机配置策略无法下发
- ¥15 如何绘制动力学系统的相图
- ¥15 对接wps接口实现获取元数据
- ¥20 给自己本科IT专业毕业的妹m找个实习工作
- ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
- ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)