UVa 10194 - Football

就是一个模拟题,稍有麻烦,基本还算是简单,但需注意的是题目有点问题,在第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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值