题目: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;
}