浙江大学PAT (Basic Level) Practice (中文)1015德才论JAVA实现代码及分析
1015
德才论
宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”
现给出一批考生的德才分数,请根据司马光的理论给出录取排名。
输入格式:
输入第一行给出 3 个正整数,分别为:N(≤10^5),即考生总数;L(≥60),为录取最低分数线,即德分和才分均不低于 L 的考生才有资格被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于 H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线 L 的考生也按总分排序,但排在第三类考生之后。
随后 N 行,每行给出一位考生的信息,包括:准考证号 德分 才分,其中 准考证号 为 8 位整数,德才分为区间 [0, 100] 内的整数。数字间以空格分隔。
输出格式:
输出第一行首先给出达到最低分数线的考生人数 M,随后 M 行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
这道题的难点在于在400ms内对于庞大的(10^5)数据量进行快速的按照规则排序处理,所以一般的冒泡之类的时间复杂度为N的平方之类的排序算法就不能采用。而JAVA库接口中有一个叫做Comparable的排序接口,这个接口内是经过优化的时间复杂度很低的排序算法。而我们只需要重写一下这个接口中的compareTo()方法,使传入的参数左右相等时返回0,左边大时返回1,反之返回-1。就可以利用它自带的方法进行快速的排序,而不用我们再去写一个排序算法。
但是仍然存在的问题是即使这样写这道题,JAVA还是不能满足在400ms内完成所有测试,相比而言C++就可以更加快速的全部完成。
具体实现代码如下:
import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; class stu implements Comparable<stu> { int zkz; int de; int cai; int ji;//对学生进行分级 public int compareTo(stu s) { if(this.ji < s.ji) return -1; else if(this.ji > s.ji) return 1; else//处于同一等级时的操作方式 { if(this.de + this.cai > s.de + s.cai) return -1; else if(this.de + this.cai < s.de + s.cai) return 1; else//德才总分相同时 { if(this.de > s.de) return -1; else if(this.de < s.de) return 1; else//德分相同时按准考证号升序排序 { if(this.zkz < s.zkz) return -1; else if(this.zkz > s.zkz) return 1; else return 0; } } } } } public class Main { public static void main(String[] args) { int N,L,H; Scanner input=new Scanner (System.in); N=input.nextInt(); L=input.nextInt(); H=input.nextInt(); stu m[]=new stu ; int s=0;//记录及格的总人数 for(int i=0;i<N;i++) { stu temp=new stu(); temp.zkz=input.nextInt(); temp.de=input.nextInt(); temp.cai=input.nextInt(); if(temp.de >= H && temp.cai >= H)//判断等级 temp.ji = 1; else if(temp.de >= H && temp.cai >= L) temp.ji = 2; else if(temp.de >= L && temp.cai >= L && temp.de >= temp.cai) temp.ji = 3; else if(temp.de >= L && temp.cai >= L) temp.ji = 4; else temp.ji = 5; if(temp.ji != 5) s++; m[i]=temp; } Arrays.sort(m); System.out.println(s); for(stu item:m) { if(item.ji==5) continue; System.out.println(item.zkz+" "+item.de+" "+item.cai); } } }
- 浙江大学PAT (Basic Level) Practice (中文)1017A除以BJAVA实现代码及分析
- 浙江大学PAT (Basic Level) Practice (中文)1016部分A+BJAVA实现代码及分析
- 浙江大学PAT (Basic Level) Practice (中文)1018锤子剪刀布JAVA实现代码及分析
- PAT (Basic Level) Practise (中文)1002. 写出这个数 (20)(java实现)
- PAT (Basic Level) Practice 1028 人口普查(20)(C语言实现)
- PAT_1020(Basic Level)Practise C语言实现代码
- PAT 乙级 (Basic Level) Practice (中文)1051
- PAT (Basic Level) Practice (中文)1059 C语言竞赛(C语言)
- PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题
- PAT 乙级 (Basic Level) Practice (中文)1025
- PAT (Basic Level) Practice (中文)1002 写出这个数 (20 分)
- PAT (Basic Level) Practice (中文)1065 单身狗(C语言)
- PAT (Basic Level) Practice (中文)1075 链表元素分类(C语言)
- PAT (Basic Level) Practice (中文)1087 有多少不同的值(C语言)
- PAT 乙级 (Basic Level) Practice (中文)1035
- PAT 乙级 (Basic Level) Practice (中文)1061
- PAT (Basic Level) Practice (中文)
- PAT (Basic Level) Practice (中文)1063 计算谱半径(C语言)
- PAT (Basic Level) Practice (中文)1067 试密码(C语言)
- PAT 乙级 (Basic Level) Practice (中文)1014