您的位置:首页 > 编程语言 > Java开发

浙江大学PAT (Basic Level) Practice (中文)1015德才论JAVA实现代码及分析

2019-03-20 21:30 591 查看

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: