簡單的排序:
此代碼是用vector和map做的,用tries應該還快一些
#include<stdio.h>
#include<string>
#include<string.h>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct team{
char name[100];
int score;
int kicked;
int lost;
}ar[2000];
int n,now;
vector<string> p;
map<string,int> q;
int search(char *t){
vector<string>::iterator
it;
it=find(p.begin(),p.end(),t);
if(it==p.end()){
strcpy(ar[now].name,t);
p.push_back(t);
q[t]=now;
return now++;
}
return q[t];
}
int cmp(team p,team q){
if(p.score==q.score){
if(p.kicked-p.lost==q.kicked-q.lost){
if(p.kicked==q.kicked)
return
strcmp(p.name,q.name)<0;
return
p.kicked>q.kicked;
}
return
p.kicked-p.lost>q.kicked-q.lost;
}
return p.score>q.score;
}
int main(){
int
i,t,a,b,x,y;
char team1[100],team2[100],ch[5],S[50];
while(scanf("%d",&n)!=EOF){
now=0;
p.clear();
q.clear();
for(i=0;i<n;i++){
ar[i].kicked=0;
ar[i].lost=0;
ar[i].score=0;
}
t=n*(n-1);
for(i=0;i<t;i++){
scanf("%s%s%s%d:%d",team1,ch,team2,&a,&b);
x=search(team1);y=search(team2);
ar[x].kicked+=a;
ar[y].kicked+=b;
ar[x].lost+=b;
ar[y].lost+=a;
if(a>b){
ar[x].score+=3;
}
else
if(a<b){
ar[y].score+=3;
}
else{
ar[x].score+=1;
ar[y].score+=1;
}
}
sort(ar,ar+n,cmp);
for(i=0;i<now;i++)
printf("%s
%d\n",ar[i].name,ar[i].score);
printf("\n");
}
return 0;
}