关闭

5-41 PAT排名汇总 (25分)

标签: c语言排名
702人阅读 评论(0) 收藏 举报
分类:

5-41 PAT排名汇总 (25分)

计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。

每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。

现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。
输入格式:

输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。
输出格式:

首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。
输入样例:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

输出样例:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

思路
比较懒,喜欢直接调用库函数qsort。先分段快排每个考点的学生排名,最后把所有考点整合起来再调用快排。然后就输出了。
点击访问 PTA-测验

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
/* 评测结果 时间  结果  得分  题目  编译器     用时(ms)  内存(MB)  用户
2016-08-30 12:10    答案正确    25  5-41    gcc     41  3   569985011
测试点结果 测试点   结果  得分/满分   用时(ms)  内存(MB)
测试点1    答案正确    12/12   14  1
测试点2    答案正确    6/6     1   1
测试点3    答案正确    1/1     21  1
测试点4    答案正确    6/6     41  3
查看代码*/
typedef struct node *Node;
struct node {
    char identifier[14];//考号,第二顺位排序依据
    int score;//分数,第一顺位排序依据
    int kaodian;//隶属考点
    int Sort_kaodian;//考点内排名
    int Sort_ToTle;
}*Students[30001];

int comp(const void*a,const void*b) {
    Node x=*(Node*)a;
    Node y=*(Node*)b;
//  printf("[x%s-%d]",x->identifier,x->score);
//  printf("[y%s-%d]",y->identifier,y->score);
    if(x->score!=y->score) {
        return y->score-x->score;
    } else {

        return strcmp(x->identifier,y->identifier);
    }

}

int main() {
    int n;//<=100
    scanf("%d",&n);
    int left=0;
    int sum=0;
    for(int i=0; i<n; i++) {
        int m;//<=300
        scanf("%d",&m);
        left=sum;
        for(int j=0; j<m; j++) {
            Students[sum]=(Node)malloc(sizeof(struct node));
            scanf("%s%d",&Students[sum]->identifier,&Students[sum]->score);
            Students[sum++]->kaodian=i+1;
//          printf("\n{%s-%d}",Students[sum-1]->identifier,Students[sum-1]->score);
        }
        qsort(&Students[left],m,sizeof(Node),comp);
        Students[left]->Sort_kaodian=1;
        for(int j=left+1; j<sum; j++) {
            if(Students[j]->score==Students[j-1]->score)Students[j]->Sort_kaodian=Students[j-1]->Sort_kaodian;
            else Students[j]->Sort_kaodian=j-left+1;
        }
    }
    printf("%d\n",sum);
    qsort(Students,sum,sizeof(Node),comp);
    Students[0]->Sort_ToTle=1;

    for(int i=0; i<sum; i++) {
        printf("%s",Students[i]->identifier);
//      printf(" %d",Students[i]->score);
        if(i) {
            if(Students[i]->score!=Students[i-1]->score) {
                Students[i]->Sort_ToTle=i+1;
            } else {
                Students[i]->Sort_ToTle=Students[i-1]->Sort_ToTle ;
            }
        }
        printf(" %d",Students[i]->Sort_ToTle );
        printf(" %d",Students[i]->kaodian);
        printf(" %d\n",Students[i]->Sort_kaodian);
    }




    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    文章分类
    最新评论