PAT (Basic Level) Practice (中文)1055 集體照 (25 分)(Java實現)

題目描述:

集體照時隊形很重要,這裏對給定的 N 個人 K 排的隊形設計排隊規則如下:

  • 每排人數爲 N/K(向下取整),多出來的人全部站在最後一排;

  • 後排所有人的個子都不比前排任何人矮;

  • 每排中最高者站中間(中間位置爲 m/2+1,其中 m 爲該排人數,除法向下取整);

  • 每排其他人以中間人爲軸,按身高非增序,先右後左交替入隊站在中間人的兩側(例如5人身高爲190、188、186、175、170,則隊形爲175、188、190、186、170。這裏假設你面對拍照者,所以你的左邊是中間人的右邊);

  • 若多人身高相同,則按名字的字典序升序排列。這裏保證無重名。

現給定一組拍照人,請編寫程序輸出他們的隊形。

輸入格式:

每個輸入包含 1 個測試用例。每個測試用例第 1 行給出兩個正整數 N104N(≤10^4​​ ,總人數)和 K(≤10,總排數)。隨後 N 行,每行給出一個人的名字(不包含空格、長度不超過 8 個英文字母)和身高([30, 300] 區間內的整數)。

輸出格式:

輸出拍照的隊形。即K排人名,其間以空格分隔,行末不得有多餘空格。注意:假設你面對拍照者,後排的人輸出在上方,前排輸出在下方。

輸入樣例:

10 3
Tom 188
Mike 170
Eva 168
Tim 160
Joe 190
Ann 168
Bob 175
Nick 186
Amy 160
John 159

輸出樣例:

Bob Tom Joe Nick
Ann Mike Eva
Tim Amy John

代碼示例(Java實現)

import java.util.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * @author snowflake
 * @create-date 2019-07-22 23:23
 */
public class Main {

    static class Node implements Comparable<Node> {

        private int length;
        private String name;

        public Node(String name, int length) {
            this.name = name;
            this.length = length;
        }

        @Override
        public int compareTo(Node o) {
            if (this.length > o.length) {
                return 1;
            } else if (this.length == o.length) {
                return o.name.compareTo(this.name);
            } else {
                return -1;
            }
        }
    }


    public static void main(String[] args) throws IOException {
        Reader.init(System.in);
        int persons = Reader.nextInt();
        int group = Reader.nextInt();

        // 聲明一個 persons 長度的集合,來存儲學生,
        // 給定空間,可以防止後面擴容影響性能
        List<Node> list = new ArrayList<>(persons);
        for (int i = 0; i < persons; i++) {
            list.add(new Node(Reader.next(), Reader.nextInt()));
        }

		// 將集合排序
        Collections.sort(list);
		
		// 創建一個臨時棧,用來存儲每一次的計算結果
        Stack<String> strings = new Stack<>();

        // 計算每組幾個人
        int person = persons / group;
        // 遍歷輸出
        for (int i = 0; i < group; i++) {
            // 不是最後一排
            if (i != group - 1) {
                StringBuilder sb = new StringBuilder(list.get(((i + 1) * person - 1)).name + " ");
                boolean flag = false;
                for (int j = (i + 1) * person - 2; j >= i * person ; j--) {
                    if (flag) {
                    	// 插入在右邊
                        sb.append(list.get(j).name).append(" ");
                        flag = false;
                    } else {
                    	// 插入在左邊
                        sb.insert(0, list.get(j).name + " ");
                        flag = true;
                    }
                }
                // 將產生的結果存儲到棧中,並將兩邊的空格給去掉
                strings.push(sb.toString().trim());
            } else {
                StringBuilder sb = new StringBuilder(list.get(list.size() - 1).name + " ");
                boolean flag = false;
                for (int j = list.size() - 2; j >= i * person ; j--) {
                    if (flag) {
                        sb.append(list.get(j).name).append(" ");
                        flag = false;
                    } else {
                        sb.insert(0, list.get(j).name + " ");
                        flag = true;
                    }
                }
                strings.push(sb.toString().trim());
            }
        }

        while (!strings.isEmpty()) {
            System.out.println(strings.pop());
        }

    }

}

/**
 * 參考別人的
 */
class Reader {

    static BufferedReader reader;
    static StringTokenizer tokenizer;

    /** call this method to initialize reader for InputStream */
    static void init(InputStream input) {
        reader = new BufferedReader(new InputStreamReader(input));
        tokenizer = new StringTokenizer("");
    }

    /** get next word */
    static String next() throws IOException {
        while (!tokenizer.hasMoreTokens())
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(reader.readLine());
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException {
        return Integer.parseInt(next());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章