原题:Football is one of the greatest games in the world. Lots of people like to play football. After one season of matches, the header has to calculate the last scores of every team. He is too lazy that he doesn't want to calculate, so he asks you to write a program for him to solve the problem.
Here are the rules:
1 Every team has to match with all the other teams.
2 Every two teams have to match for two times,one at home and one away.
3 In one match, the winner will get 3 points, the loser will get 0 point. If it is draw, both of them will get 1 point.
题意:
输入几支球队的相互比赛的比分,求出各个球队的排名,遵循以下几个优先选择:
1.一场比赛胜利得3分,平局得一分,失败不得分,最后得分数作为第一排序元素
2.如果得分相同,则按照净胜球排序,及净胜球=进球数-失球数
3.如果净胜球数相同,则按照进球数排名
4.如果进球数相同,则按照球队名称字典序
题解:
1.创建一个结构体包括球队名称、进球数、失球数、得分数、净胜球数
2.按照以上四个原则写compare函数
3.另写一个函数来找到这个球队在数组中的位置以便进行操作,如果在数组中没找到这个球队还要初始化这个球队的信息
4.输入数据进行sort(A,A+n,compare),然后输出
代码:AC
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct node
{
char name[60];
int grade,win,lost,margin;
}node;
int num;
node data[1000];
bool compare(node a,node b)
{
if(a.grade!=b.grade)
return a.grade>b.grade;
else if(a.margin!=b.margin)
return a.margin>b.margin;
else if(a.win!=b.win)
return a.win>b.win;
else
{
if(strcmp(a.name,b.name)==-1)
return true;
else
return false;
}
}
int find(char *a)
{
int i;
for(i=0;i<num;i++)
{
if(strcmp(a,data[i].name)==0)
return i;
}
return -1;
}
int main()
{
int n,grade1,grade2;
char team1[60];
char team2[60];
while(cin>>n)
{
num=0;
memset(data,0,sizeof(data));
int sum=n*(n-1);
char VS[5];
int i;
num=0;
for(i=0;i<sum;i++)
{
scanf("%s %s %s %d:%d",team1,VS,team2,&grade1,&grade2);
int t;
t=find(team1);
if(t==-1)
{
strcpy(data[num].name,team1);
data[num].win=grade1;
data[num].lost=grade2;
data[num].margin=grade1-grade2;
if(grade1>grade2)
data[num].grade=3;
else if(grade1==grade2)
data[num].grade=1;
num++;
}
else
{
data[t].win+=grade1;
data[t].lost+=grade2;
data[t].margin+=(grade1-grade2);
if(grade1>grade2)
data[t].grade+=3;
else if(grade1==grade2)
data[t].grade+=1;
}
t=find(team2);
if(t==-1)
{
strcpy(data[num].name,team2);
data[num].win=grade2;
data[num].lost=grade1;
data[num].margin=grade2-grade1;
if(grade1<grade2)
data[num].grade=3;
else if(grade1==grade2)
data[num].grade=1;
num++;
}
else
{
data[t].win+=grade2;
data[t].lost+=grade1;
data[t].margin+=(grade2-grade1);
if(grade1<grade2)
data[t].grade+=3;
else if(grade1==grade2)
data[t].grade+=1;
}
}
sort(data,data+n,compare);
for(i=0;i<n;i++)
{
cout<<data[i].name<<" "<<data[i].grade<<endl;
}
cout<<endl;
}
return 0;
}