pat德才論(java)
/**
* 德才論
* 題目描述
* 宋代史學家司馬光在《資治通鑑》中有一段著名的“德才論”:“是故才德全盡謂之聖人,才德兼亡謂之愚人,
* 德勝才謂之君子,才勝德謂之小人。凡取人之術,苟不得聖人,君子而與之,與其得小人,不若得愚人。”
* 現給出一批考生的德才分數,請根據司馬光的理論給出錄取排名。
* 輸入描述:
* 輸入第1行給出3個正整數,分別為:N(<=105),即考生總數;L(>=60),為錄取最低分數線,即德分
* 和才分均不低於L的考生才有資格被考慮錄取;H(<100),為優先錄取線——德分和才分均不低於此線的被
* 定義為“才德全盡”,此類考生按德才總分從高到低排序;才分不到但德分到線的一類考生屬於“德勝才”,
* 也按總分排序,但排在第一類考生之後;德才分均低於H,但是德分不低於才分的考生屬於“才德兼亡”但尚
* 有“德勝才”者,按總分排序,但排在第二類考生之後;其他達到最低線L的考生也按總分排序,但排在第三
* 類考生之後。隨後N行,每行給出一位考生的資訊,包括:准考證號、德分、才分,其中准考證號為8位整數,
* 德才分為區間[0, 100]內的整數。數字間以空格分隔。
* 輸出描述:
* 輸出第1行首先給出達到最低分數線的考生人數M,隨後M行,每行按照輸入格式輸出一位考生的資訊,考生
* 按輸入中說明的規則從高到低排序。當某類考生中有多人總分相同時,按其德分降序排列;若德分也並列,
* 則按准考證號的升序輸出。
* 輸入例子:
* 14 60 80
* 10000001 64 90
* 10000002 90 60
* 10000011 85 80
* 10000003 85 80
* 10000004 80 85
* 10000005 82 77
* 10000006 83 76
* 10000007 90 78
* 10000008 75 79
* 10000009 59 90
* 10000010 88 45
* 10000012 80 100
* 10000013 90 99
* 10000014 66 60
* 輸出例子:
* 12
* 10000013 90 99
* 10000012 80 100
* 10000003 85 80
* 10000011 85 80
* 10000004 80 85
* 10000007 90 78
* 10000006 83 76
* 10000005 82 77
* 10000002 90 60
* 10000014 66 60
* 10000008 75 79
* 10000001 64 90
*/
總體思路:建立一個類包含學號,得分,和才分。用四種集合分別存入輸入的符合題意的。然後對集合進行自定義快排。
但是我不是這麼想的,我想利用優先佇列讓他自動排序。我只需要設定他是大根堆還是小根堆就行了。程式碼如下:
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
public class part5 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int allcount=sc.nextInt();//總人數
int count=0;//滿足條件的人數
int last=sc.nextInt ();//最低分
int well=sc.nextInt();//德才優秀
student stu[]=new student[allcount];
Queue<student> c1 = new PriorityQueue<>(cmp1);//德才兼備
Queue<student> c2 = new PriorityQueue<>(cmp1);//才分不到但德分到線的一類考生屬於“德勝才”
Queue<student> c3 = new PriorityQueue<>(cmp1);//德才分均低於H,但是德分不低於才分的考生屬於“才德兼亡”但尚有“德勝才”者
Queue<student> c4 = new PriorityQueue<>(cmp1);//其他
for(int i=0;i<allcount;i++)
{
int no1=sc.nextInt();
int no2=sc.nextInt();
int no3=sc.nextInt();
stu[i]=new student(no1,no2,no3);
}
for(int i=0;i<allcount;i++)
{
if(stu[i].de>=last&&stu[i].cai>=last)
{
count++;
if(stu[i].cai>=well&&stu[i].de>=well)
{c1.add(stu[i]);}
else if(stu[i].cai>=last&&stu[i].de>=well)
{c2.add(stu[i]);}
else if(stu[i].de>=stu[i].cai&&stu[i].cai<well)//注意沒有才分高於well,得分低於**的選項
{c3.add(stu[i]);}
else
{c4.add(stu[i]);}//其他狀況
}
}
System.out.println(count);
while(!c1.isEmpty())
{
student st=c1.poll();//移除並返回頭
System.out.println(st.number+" "+st.de+" "+st.cai);
}
while(!c2.isEmpty())
{
student st=c2.poll();//移除並返回頭
System.out.println(st.number+" "+st.de+" "+st.cai);
}
while(!c3.isEmpty())
{
student st=c3.poll();//移除並返回頭
System.out.println(st.number+" "+st.de+" "+st.cai);
}
while(!c4.isEmpty())
{
student st=c4.poll();//移除並返回頭
System.out.println(st.number+" "+st.de+" "+st.cai);
}
}
static Comparator<student>cmp1=new Comparator<student>()
{
public int compare(student a, student b) {
if(a.de+a.cai==b.cai+b.de)//如果總分相同
{
if(a.de==b.de)
{
return a.number-b.number;//按照學號升序
}
else
{return b.de-a.de;}//返回大根堆
}
else
return (int)(b.cai+b.de-a.de-a.cai);//返回大根堆
}
};
static class student
{
int number;
int de;
int cai;
public student(int number,int de,int cai)
{
this.number=number;
this.de=de;
this.cai=cai;
}
}
}
水平有限。。有好想法的多多交流。