感觉这道题就是代码长点,一些细节问题处理好就可以了,我的代码比较通俗的: #include <stdio.h> #include "iostream" #include "string" using namespace std; struct Value { string name; int score; int goal; int tickinball; }; int Comp(const void *p1,const void *p2) { struct Value *c = (Value *)p1; struct Value *d = (Value *)p2; if(c->score != d->score) return d->score-c->score; else if(c->goal != d->goal) return d->goal - c->goal; else if(c->tickinball != d->tickinball) return d->tickinball - c->tickinball; else return c->name >= d->name? 1:-1; } int main() { Value team[20]; int N; while (scanf("%d",&N) != EOF) { int num = N*(N-1); char temp1[20]; char temp2[20]; int goal1,goal2,flag1,flag2; int cou = 0; for (int k =0;k<20;k++) { team[k].name = " "; team[k].tickinball=0; team[k].goal=0; team[k].score =0; } for (int i = 0;i<num;i++) { flag1=0;flag2=0; scanf("%s VS%s %d:%d",&temp1,&temp2,&goal1,&goal2); for (int j = 0;j<cou;j++) { if (temp1 == team[j].name && !flag1) { team[j].score += (goal1 == goal2)?1:(goal1>goal2?3:0); team[j].goal += (goal1-goal2); team[j].tickinball += goal1; flag1 = 1; } if (temp2 == team[j].name && !flag2) { team[j].score += (goal1 == goal2)?1:(goal1<goal2?3:0); team[j].goal += (goal2-goal1); team[j].tickinball += goal2; flag2 = 1; } } if (!flag1) { team[cou].name = temp1; team[cou].goal += (goal1 -goal2); team[cou].tickinball += goal1; team[cou++].score += (goal1 == goal2)?1:(goal1>goal2?3:0); } if (!flag2) { team[cou].name = temp2; team[cou].goal += (goal2 -goal1); team[cou].tickinball += goal2; team[cou++].score += (goal1 == goal2)?1:(goal1<goal2?3:0); } } qsort ( team, cou, sizeof ( Value ) , Comp) ; for (i = 0 ;i<cou;i++) { cout << team[i].name <<" "<<team[i].score<<endl; } cout << endl; } return 0; }