Olympic Game[medium]

题目描述

2012伦敦奥运会即将到来,大家都非常关注奖牌榜的情况,现在我们假设奖牌榜的排名规则如下:

1、首先gold medal数量多的排在前面;
2、其次silver medal数量多的排在前面;
3、然后bronze medal数量多的排在前面;
4、若以上三个条件仍无法区分名次,则以国家名称的字典序排定。
我们假设国家名称不超过20个字符、各种奖牌数不超过100,且大于等于0。

解答要求
时间限制:1000ms, 内存限制:100MB
输入
第一行输入一个整数N(0<N<21),代表国家数量;
然后接下来的N行,每行包含一个字符串Namei表示每个国家的名称,和三个整数Gi、Si、Bi表示每个获得的gold medal、silver medal、bronze medal的数量,以空格隔开,如(China 51 20 21),具体见样例输入。

输出
输出奖牌榜的依次顺序,只输出国家名称,各占一行,具体见样例输出。

样例

输入样例 1
5
China 32 28 34
England 12 34 22
France 23 33 2
Japan 12 34 25
Rusia 23 43 0

输出样例
China
Rusia
France
Japan
England

题目代码

使用了qsort这一排序法对结构体进行排序,注意到qsort的强制类型转换

点击查看代码
// we have defined the necessary header files here for this problem.
// If additional header files are needed in your program, please import here.


typedef struct{
        int g;
        int s;
        int b;
        char name[50];
    }cou;
int cmpfunc (const void * a, const void * b)
{    
    
    if( (*(cou*)a).g >(*(cou*)b).g ){
        return -1;
    }
    else if ( (*(cou*)a).g <(*(cou*)b).g )
        return 1;
    
    if( (*(cou*)a).s >(*(cou*)b).s ){
        return -1;
    }
    else if ( (*(cou*)a).s <(*(cou*)b).s )
        return 1;
    
    if( (*(cou*)a).b >(*(cou*)b).b ){
       return -1;
    }
    else if ( (*(cou*)a).b <(*(cou*)b).b )
       return 1;
        
    return strcmp( (*(cou*)a).name, (*(cou*)b).name );
  
}


int main()
{
    // please define the C input here. For example: int n; scanf("%d",&n);
    // please finish the function body here. 
    // please define the C output here. For example: printf("%d\n",a);    
 
    int n;
    scanf("%d",&n);
    cou cous[22]={0};
    for(int i=0;i<=n;i++){
        
        scanf("%s %d %d %d",cous[i].name,&cous[i].g,&cous[i].s,&cous[i].b);
        
    }
    
    qsort(cous,n,sizeof(cou),cmpfunc);
    for(int i=0;i<n;i++){
        printf("%s\n",cous[i].name);
    }
    return 0;
}

qsort

点击查看代码
# qsort
void qsort(
    void *base,
    size_t nmemb,
    size_t size,
    int (*compar)(const void *, const void *)
    );

compar排序

qsort里面有一个函数为compar,是一个函数指针,指向了compar函数,compar函数返回-1,0,1
-1为前面的大 1为后面的大

compareMyType (const void * a, const void * b)

这里要强制类型转换为自己的类型,结构体就转结构,然后再是指针指向的两个值的比较
(*(struct*)a).g >(*(struct*)b).g

点击查看代码
int compareMyType (const void * a, const void * b)
{
  if ( *(MyType*)a <  *(MyType*)b ) return -1;
  if ( *(MyType*)a == *(MyType*)b ) return 0;
  if ( *(MyType*)a >  *(MyType*)b ) return 1;
}

上一篇:python报错:Failed to establish a new connection: [Errno -2] Name or service not known


下一篇:封装sw.js