题目:http://acm.hdu.edu.cn/showproblem.php?pid=1225
就是对各种结构体排序。。在调用sscanf()函数时应该注意。。。应该加去地址符。。。。
如sscanf("12","%c%",&a,&b); 和scanf()函数类似
下面是AC代码:
#include<iostream> #include<cstring> using namespace std; char str[100]; struct node { char name[20]; int score; int goal; int kick; int lost; }f[10000000]; int cmp(const void *a,const void *b) { node *c=(node *)a; node *d=(node *)b; if(c->score==d->score) { if(c->goal==d->goal) { if(c->kick==d->kick) { return strcmp(c->name,d->name)?1:-1; } return c->kick>d->kick?-1:1; } return c->goal>d->goal?-1:1; } return c->score>d->score?-1:1; } int main() { int n; int l,i,j; char team1[20],team2[20]; int s1,s2; int k1,k2; while(scanf("%d",&n)!=EOF) { getchar(); l=0; for(i=1;i<=n*(n-1);i++) { gets(str); sscanf(str,"%s VS %s %d:%d", team1,team2,&s1,&s2); //要加取地址符。。。如同scanf的用法 for(j=0;j<l;j++) { if(strcmp(f[j].name,team1)==0) { k1=j; break; } } if(j==l) { k1=l; strcpy(f[l].name,team1); f[l].score=0,f[l].goal=0;f[l].kick=0;f[l].lost=0; l++; } for(j=0;j<l;j++) { if(strcmp(f[j].name,team2)==0) { k2=j; break; } } if(j==l) { k2=l; strcpy(f[l].name,team2); f[l].score=0,f[l].goal=0,f[l].kick=0;f[l].lost=0; l++; } f[k1].kick+=s1; f[k1].lost+=s2; f[k2].kick+=s2; f[k2].lost+=s1; if(s1==s2) { f[k1].score+=1; f[k2].score+=1; } else if(s1>s2) { f[k1].score+=3; } else f[k2].score+=3; // printf("%s %d",f[2].name,f[2].score); } for(i=0;i<l;i++) f[i].goal=f[i].kick-f[i].lost; qsort(f,l,sizeof(f[0]),cmp); for(i=0;i<l;i++) printf("%s %d\n",f[i].name,f[i].score); printf("\n"); } return 0; }