PAT甲级 1012 The Best Rank------排序

2024-02-14 15:08

本文主要是介绍PAT甲级 1012 The Best Rank------排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述:
To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algrbra), and E - English. At the mean time, we encourage students by emphasizing on their best ranks – that is, among the four ranks with respect to the three courses and the average grade, we print the best rank for each student.

For example, The grades of C, M, E and A - Average of 4 students are given as the following:

StudentID  C  M  E  A
310101     98 85 88 90
310102     70 95 88 84
310103     82 87 94 88
310104     91 91 91 91

Then the best ranks for all the students are No.1 since the 1st one has done the best in C Programming Language, while the 2nd one in Mathematics, the 3rd one in English, and the last one in average.

Input Specification:
Each input file contains one test case. Each case starts with a line containing 2 numbers N and M (≤2000), which are the total number of students, and the number of students who would check their ranks, respectively. Then N lines follow, each contains a student ID which is a string of 6 digits, followed by the three integer grades (in the range of [0, 100]) of that student in the order of C, M and E. Then there are M lines, each containing a student ID.

Output Specification:
For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space.

The priorities of the ranking methods are ordered as A > C > M > E. Hence if there are two or more ways for a student to obtain the same best rank, output the one with the highest priority.

If a student is not on the grading list, simply output N/A.

Sample Input:

5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999

Sample Output:

1 C
1 M
1 E
1 A
3 A
N/A

题目大意:
就是一个排序的问题。

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
struct node
{int id,best;        //存最高名次的下标, 像这种情况,从来都是比存值要来的更有效。int score[4],rank[4];
}stu[2001];
int flag=0;
bool cmp(node a,node b){ return a.score[flag]>b.score[flag];}
int main()
{int n,k,exist[1000000]={0},id;cin>>n>>k;for(int i=0;i<n;i++){scanf("%d %d %d %d",&stu[i].id,&stu[i].score[1],&stu[i].score[2],&stu[i].score[3]);     // c   m    e     astu[i].score[0]=(stu[i].score[1]+stu[i].score[2]+stu[i].score[3])/3+0.5;}for(int i=0;i<4;i++,flag++){         //flag为了控制排序的    名次排完了,并且存储好了sort(stu,stu+n,cmp);stu[0].rank[i]=1;for(int j=1;j<n;j++)              //这个地方得考虑名次相等的情况if(stu[j].score[i]==stu[j-1].score[i]) stu[j].rank[i]=stu[j-1].rank[i];else stu[j].rank[i]=j+1;}for(int i=0;i<n;i++){               //为了寻找best,找到最高名次的小标int min=n+1;exist[stu[i].id]=i+1;            //这个时候stu数组中的顺序已经确定了,只是为了以后方便定位for(int j=0;j<4;j++)if(stu[i].rank[j]<min){min=stu[i].rank[j];stu[i].best=j;}}char sub[4]={'A','C','M','E'};for(int i=0;i<k;i++){cin>>id;int t=exist[id];if(t) printf("%d %c\n",stu[t-1].rank[stu[t-1].best],sub[stu[t-1].best]);else printf("N/A\n");}/*for(int i=0;i<n;i++)printf("%d %d %d %d %d\n",stu[i].id,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3]);for(int i=0;i<n;i++)printf("%d %d %d %d %d\n",stu[i].id,stu[i].rank[0],stu[i].rank[1],stu[i].rank[2],stu[i].rank[3]);*/return 0;
}

来总结一下:
正如图中的代码所示,代表了这道题写题的一个思路。接下来说一下思路,遇到的问题和感悟。

  • 思路就是:对每个成绩都排序,分别存储每个成绩的名词,在从所有名次中找到最高的名次,然后在输出最高名次的同时,也输出相对应的成绩。(思路很简单,关键在于如何存储,怎样定位!)

  • 首先,这个题这么多的成绩,声明好几个数组肯定是不合适的,而且还不好找,所以就需要定义一个结构体,(如果数量很少就可以使用下标的方法来存储)。既然有四个成绩,就要有四个下标,一一对应,来表示每个成绩的排名。best最有用的地方在于它找出的是最高名次的下标,这样就可以直接定位,而不用再费劲的去查找了。

  • sort函数中的自定义函数cmp中可以放置一个未知数flag,可以在循环中每次对同一类的成绩进行排序,但是flag必须为全局变量,要不然的话,会报错!
    !!! 排序的过程很关键,主要是因为排序是所有的一起换,而不是只换其中的某一项,所以可以放心大胆的换,也可以放心大胆的存储名次。

  • 最后就是exist数组设定,题目当中要求学号的长度为6位,我设置完1000000的长度之后,在我电脑上是运行不了的(估计是申请的空间太大了),所以可以在自己测试的时候,设置小一些,然后在提交的时候再改回去。这个数组的作用主要有两点:
    1)来查找这个id是否存在。
    2)也是最重要的一点,有了学生的id,因为要输出再去遍历结构体数组的话太麻烦了,这个数组就是将学生的id和这个id所在的结构体数组的下标结合在一起(方便在输出的时候直接定位)。

 exist[stu[i].id]=i+1;   

这个题难点不是在排序,而在于定位,定位的两个关键点,一个是best,一个是exist数组。

这篇关于PAT甲级 1012 The Best Rank------排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/708830

相关文章

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig