7-15 PAT Judge (25分)

 

 

 

 解题思路:

题目要求:

1、按总分降序,若总分相等,则按题目满分数目降序,若满分题目数目相等,则按学号升序

2、若全部题目均是未提交或者提交未通过,不输出

#include <stdio.h>
#define MaxN 10001
#define MaxK 5+1
typedef struct{
    int sum,cnt,rank,id,Rflag,Ptag[MaxK];
    int num[MaxK];
} Node;
int cmp(const void *a,const void *b){
    Node* c = (Node*)a;
    Node* d = (Node*)b;
    if(c->sum == d->sum){
        if(c->cnt == d->cnt){
            return c->id > d->id;
        }
        return c->cnt < d->cnt;
    }
    return c->sum < d->sum;
}

int main() {
    int n,k,m;
    scanf("%d %d %d",&n,&k,&m);
    int i,j;
    int max[k+1];
    Node f[n+1];
    for(i=1; i<=k; i++) {
        scanf("%d",&max[i]);
    }
    for(i=1; i<=n; i++) {//初始化
        f[i].cnt=0;
        f[i].rank=0;
        f[i].sum=0;
        f[i].id=i;
        f[i].Rflag=0;
        for(j=1; j<=MaxK; j++) {
            f[i].num[j]=0;
            f[i].Ptag[j]=0;
        }
    }
    for(i=0; i<m; i++) {
        int x,y,z;
        scanf("%d %d %d",&x,&y,&z);
        if(z>-1) {
            f[x].Rflag=1;//标记该题已提交且通过
            if(f[x].num[y]<z)
                f[x].num[y]=z;
        }
        f[x].Ptag[y]=1;//标记该题有提交

    }
    for(i=1; i<=n; i++) {
        if(f[i].Rflag) {
            for(j=1; j<=k; j++) {
                    f[i].sum+=f[i].num[j];
                if(f[i].num[j]==max[j])//记录满分题目数目
                    f[i].cnt++;
            }
        }
    }
    qsort(f+1,n,sizeof(Node),cmp);
    int r=1,cnt=1;
    f[1].rank=r;
    for(i=2; i<=n; i++) {
        cnt++;
        if(f[i-1].sum==f[i].sum)
            f[i].rank=r;
        else {
            r=cnt;
            f[i].rank=r;
        }

    }
    for(i=1; i<=n; i++) {
        if(f[i].Rflag) {
            printf("%d %05d %d",f[i].rank,f[i].id,f[i].sum);
            for(j=1; j<=k; j++) {
                if(f[i].Ptag[j])
                    printf(" %d",f[i].num[j]);
                else
                    printf(" -");
            }
            puts("");
        }

    }
    return 0;
}
原文地址:https://www.cnblogs.com/snzhong/p/12800807.html