題目描述:
集體照時隊形很重要,這裏對給定的 N 個人 K 排的隊形設計排隊規則如下:
-
每排人數爲 N/K(向下取整),多出來的人全部站在最後一排;
-
後排所有人的個子都不比前排任何人矮;
-
每排中最高者站中間(中間位置爲 m/2+1,其中 m 爲該排人數,除法向下取整);
-
每排其他人以中間人爲軸,按身高非增序,先右後左交替入隊站在中間人的兩側(例如5人身高爲190、188、186、175、170,則隊形爲175、188、190、186、170。這裏假設你面對拍照者,所以你的左邊是中間人的右邊);
-
若多人身高相同,則按名字的字典序升序排列。這裏保證無重名。
現給定一組拍照人,請編寫程序輸出他們的隊形。
輸入格式:
每個輸入包含 1 個測試用例。每個測試用例第 1 行給出兩個正整數 ,總人數)和 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());
}
}