1. 程式人生 > 其它 >Java題解—1015 德才論 (25 分)

Java題解—1015 德才論 (25 分)

原題

傳送門

思路

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