ps:这题的输入我看到括号以为要用字符串,谁知道看了大神的才知道可以这样"scanf("%d(%d)",&a,&b);"  觉得好神奇.. 然后知道了scanf()返回的是接收的个数,如果只有一个就会返回1,2个返回2,这样就可以很好的解决这个问题了。。。

还有一个很大很大的收获。就是qsort里面的cmp,可以自己编写,编写的格式:

int cmp(const void *a,const void *b){

}

里面会用到指针,所以一开始的形参会用const void *a和const void *b,要是你要比较的是其他类型的,必须改变他.比如整型,  int *q=(int *)a.

然后就是返回,返回值是一个int型的数,如果大于0,就认为a>b,小于0,就认为a<b.  如果return  a-b  ,就会得到升序,return b-a就会得到降序.

贴上代码;

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int cmp(const void *a,const void *b);
typedef struct people{
    char name[15];
    int time;
    int num;
}people;
people peo1[1010];
int main(){
    int n,m,num,time,num1,i,a,b;
    char name[15];
    num1=0;
    scanf("%d%d",&n,&m);
    while(~scanf("%s",&name)){
        num=time=0;
        for(i=0;i<n;i++){
            if(scanf("%d(%d)",&a,&b)==2){
                num++;
                time+=(a+b*m);
            }
            else{
                if(a>0){
                    num++;
                    time+=a;
                }
            }
            
        }
        strcpy(peo1[num1].name,name);
        peo1[num1].time=time;
        peo1[num1].num=num;
        num1++;
    }
    qsort(peo1,num1,sizeof(people),cmp);
    for(i=0;i<num1;i++){
        printf("%-10s %2d %4d\n",peo1[i].name,peo1[i].num,peo1[i].time);
    }
    return 0;
}
int cmp(const void *a,const void *b){
    people *p = (people*)a,*q=(people *)b;
    if(p->num!=q->num) return q->num-p->num;
    if(p->time!=q->time) return p->time-q->time;
    return strcmp(p->name,q->name);
}