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

原创 2016年08月30日 12:14:00

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;
}


版权声明:写这些东西还是问了交流进步,如果你有不同的方法、见解,欢迎交流分享。文章中附的代码只传达当时我的一种做法,并非我认为最好的。

相关文章推荐

PAT排名汇总 (25分)

PAT排名汇总   (25分) 计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程...

10-排序5 PAT Judge (25分)

排序规则: 1. 总分相同,名次相同。 2. 总分相同,按照完全正确的题目数量排序。 3. 1、2一致,根据id排名。 4. 没有通过编译的,或者没有得分的,不列出。 5. 保证至少有一个人能出现...
  • Van0512
  • Van0512
  • 2016年11月04日 01:30
  • 391

7-07. PAT排名汇总(25) (结构体 ZJU_PAT)

7-07. PAT排名汇总(25) (结构体 ZJU_PAT)

【PTA 5-10 树的遍历 (25分)】+ 二叉树

5-10 树的遍历 (25分) 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式:输入第一行给出一个正整数NN(\le 30≤30),...

5-21 求前缀表达式的值 (25分)

5-21 求前缀表达式的值 (25分)算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3∗(7−4)+8/42+3*(7-4)+8/4的前缀...

5-3 列车调度 (25分)

algorithm函数库里的lower_bound函数就好。与之相对应的是upper_bound函数。

5-4 搜索树判断 (25分)

5-4 搜索树判断   (25分) 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的...

5-8 抢红包 (25分)

没有人没抢过红包吧…… 这里给出NN个人之间互相发红包、抢红包的记录,请你统计一下他们抢红包的收获。 输入格式: 输入第一行给出一个正整数NN(\le 10^4≤10​4​​),即参与...

5-12 排序 (25分)

5-12 排序 (25分) 给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:只有1个元素...

5-4 魔法优惠券 (25分)

在火星上有个魔法商店,提供魔法优惠券。每个优惠劵上印有一个整数面值K,表示若你在购买某商品时使用这张优惠劵,可以得到K倍该商品价值的回报!该商店还免费赠送一些有价值的商品,但是如果你在领取免费赠品的时...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:5-41 PAT排名汇总 (25分)
举报原因:
原因补充:

(最多只允许输入30个字)