【问题描述】
在某场赛事中,有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哪个队伍,根据比分计算积分,最后进行排序和名次
#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;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!