Java題解—1015 德才論 (25 分)
阿新 • • 發佈:2021-10-18
原題
思路
1、首先分根據題意,分四類。
在大前提大於等於及格線下。第一類:都大於等於H。第二類:德大於等於H並且才小於H。第三類:德才小於H但德大於等於才。第四類:就是不滿足上面三類但在及格線上的。
處理:我對每個類別,在條件判別後,用一個集合分別裝入。
2、在分屬的類裡進行排序。
排序要求:總分降序。在總分相等時,德分降序。在總分和得分相等時,准考證號升序。
處理:因為總分和德分是,兩個關鍵字的組合排序且排序方向一樣,嘗試拼接起來再比較拼接的數字大小,作逆向排序。
由於我把所有關鍵字都拼接起來了,准考證號需加一個判斷,再對這組拼接數字作正向排序。
以下程式碼顯得很多的是:不停的整型和字串型轉換和具體關鍵字的擷取。
如果換成物件(或c語言的結構體)儲存記錄就不用頻繁的轉換了。
還有利用了物件間的Comparor比較器排序,自己造一個函式排會再麻煩一點吧。
程式碼
錯誤超時版
import java.util.ArrayList; import java.util.Comparator; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int N=scanner.nextInt(); int L=scanner.nextInt(); int H=scanner.nextInt(); //分成四個層次,用集合裝 ArrayList<Long> group1 = new ArrayList<>(); ArrayList<Long> group2 = new ArrayList<>(); ArrayList<Long> group3 = new ArrayList<>(); ArrayList<Long> group4 = new ArrayList<>(); int count1=0,count2=0,count3=0,count4=0;//計數 for (int i=0;i<N;i++){ int registrationNum=scanner.nextInt();//准考證號 int moralGrade=scanner.nextInt();//德行分 int brillianceGrade=scanner.nextInt();//才智分 long total=moralGrade+brillianceGrade;//總分 //先分層再排序 if(moralGrade>=L && brillianceGrade>=L) { Long examinee=Long.parseLong(total+"0"+moralGrade+""+registrationNum+"0"+brillianceGrade); //才德全盡 if (moralGrade>=H&&brillianceGrade>=H){ //拼接加0,統一格式,分數三位數 if (moralGrade==100&&brillianceGrade==100) group1.add(count1,Long.parseLong(total+""+moralGrade+""+registrationNum+""+brillianceGrade)); else if(moralGrade!=100&&brillianceGrade==100) group1.add(count1,Long.parseLong(total+"0"+moralGrade+""+registrationNum+""+brillianceGrade)); else if(moralGrade==100&&brillianceGrade!=100) group1.add(count1,Long.parseLong(total+""+moralGrade+""+registrationNum+"0"+brillianceGrade)); else group1.add(count1,examinee); count1++; } //德勝才 else if(moralGrade>H&&brillianceGrade<H){ group2.add(count2,examinee); count2++; } //“才德兼亡”但尚有“德勝才”者 else if (moralGrade<H && brillianceGrade<H && moralGrade>=brillianceGrade){ group3.add(count3,examinee); count3++; } //其它 else { group4.add(count4,examinee); count4++; } } } //輸出 System.out.println(count1+count2+count3+count4); sort(group1); sort(group2); sort(group3); sort(group4); } //對單個層次集合裡的資料,按輸出要求排序 public static void sort(ArrayList<Long> group){ group.sort(new Comparator<Long>() { @Override public int compare(Long o1, Long o2) { if (o1/1000/100000000/1000==o2/1000/100000000/1000&&o1/1000/100000000%1000==o2/1000/100000000%1000) return Long.compare(o1,o2);//總分和德分相同的情況下,按從小到大排 else return -Long.compare(o1,o2);//其它情況,按從大到小順序排 } }); for (Long l:group){//把序號、分數分離開分別列印 long a=l/1000%100000000; long b=l/1000/100000000%1000; long c=l%1000; System.out.println(a+" "+b+" "+c); } } }