就是一个模拟题,稍有麻烦,基本还算是简单,但需注意的是题目有点问题,在第6条按字典序排序的时候是不分大小写的,在这里被坑了两次 ~~~
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
char tourname[1000+2],game[1000][100];
typedef struct Team
{
int b,c,d,e,f,g,h,i;
char team[40];
} TT;
TT t[200+2];
int struct_cmp(const void *b,const void *a) // qsort多条件排序
{
int i;
TT *c=(TT *)a;
TT *d=(TT *)b;
if(c->b!=d->b) return c->b-d->b;
else if(c->d!=d->d) return c->d-d->d;
else if(c->g!=d->g) return c->g-d->g;
else if(c->h!=d->h) return c->h-d->h;
else if(c->c!=d->c) return d->c-c->c;
else
{
char s1[40]={'\0'},s2[40]={'\0'};
strcpy(s1,d->team);
strcpy(s2,c->team);
for(i=0; i<strlen(c->team); i++) s2[i]=toupper(s2[i]); // 不分大小写,所以要全部转化成大写或是小写再进行比较
for(i=0; i<strlen(d->team); i++) s1[i]=toupper(s1[i]);
return strcmp(s1,s2);
}
}
void addsort(int T,int G)
{
int i,j,numa,numb,fa,fb;
char ma[40],mb[40];
for(i=0; i<T; i++)
{
t[i].b=t[i].c=t[i].d=t[i].e=t[i].f=t[i].g=t[i].h=t[i].i=0;
}
for(i=0; i<G; i++)
{
sscanf(game[i],"%[^#]#%d@%d#%[^\n]",ma,&numa,&numb,mb);
for(j=0; j<T; j++)
if(strcmp(t[j].team,ma)==0)
{
fa=j;
break;
}
for(j=0; j<T; j++)
if(strcmp(t[j].team,mb)==0)
{
fb=j;
break;
}
t[fa].c+=1;
t[fb].c+=1;
t[fa].h+=numa;
t[fb].h+=numb;
t[fa].i+=numb;
t[fb].i+=numa;
t[fa].g=t[fa].h-t[fa].i;
t[fb].g=t[fb].h-t[fb].i;
if(numa>numb)
{
t[fa].d++;
t[fb].f++;
t[fa].b+=3;
}
else if(numa<numb)
{
t[fa].f++;
t[fb].d++;
t[fb].b+=3;
}
else
{
t[fa].e++;
t[fb].e++;
t[fa].b++;
t[fb].b++;
}
}
}
int main()
{
#ifdef test
freopen("sample.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int N,T,G;
int i;
scanf("%d",&N);
getchar();
while(N--)
{
gets(tourname);
scanf("%d",&T);
getchar();
for(i=0; i<T; i++)
gets(t[i].team);
scanf("%d",&G);
getchar();
for(i=0; i<G; i++)
gets(game[i]);
addsort(T,G);
qsort(t,T,sizeof(t[0]),struct_cmp);
printf("%s\n",tourname);
for(i=0; i<T; i++)
printf("%d) %s %dp, %dg (%d-%d-%d), %dgd (%d-%d)\n",i+1,t[i].team,t[i].b,t[i].c,t[i].d,t[i].e,t[i].f,t[i].g,t[i].h,t[i].i);
if(N!=0)
puts("");
}
return 0;
}