計蒜課:泥塑課

題目

題目鏈接:泥塑課 - 題庫 - 計蒜課

1000ms,65536K

小米是一個幼兒園老師,每學期的泥塑課上,她都會給每個學生髮不超過 250 立方厘米的等量橡皮泥,教大家做泥塑。在上課過程中,她發現每個班都恰好有一個小朋友會去搶另一個小朋友的橡皮泥,於是她決定,在正式開始做泥塑前,讓大家把手裏的橡皮泥都捏成一個立方體,並且測量手裏捏好的橡皮泥的長、寬和高。這樣,她就可以知道誰被誰搶了橡皮泥了。

輸入格式

小米老師在不同的學期可能會帶一個班或者同時帶多個班,因此輸入數據可能有一組或者多組。

每組輸入數據的第一行爲一個整數 n,表示了這個班的小朋友數,之後 n 行每行包括了由空格分隔的三個整數和一個字符串,那個字符串表示了小朋友的名字,前面三個整數則是這個學生手裏橡皮泥塊的長、寬、高數據。按照幼兒園的規定,每個班最多有 9 個小朋友,最少也要有 2 個小朋友,每個小朋友在學籍系統中的名稱不超過 8 個字符長。當出現一個班級的小朋友數爲 -1 時,表示沒有更多的班級了。

輸出格式

輸出行數與小米老師帶的班級數相同,形式爲

X took clay from Y.

,具體請參考樣例輸出。

樣例輸入

3
10 10 2 Jill
5 3 10 Will
5 5 10 Bill
4
2 4 10 Cam
4 3 7 Sam
8 11 1 Graham
6 2 7 Pam
-1

樣例輸出

Bill took clay from Will.
Graham took clay from Cam.

分析

看到題目,我的第一反應是:泥塑體積最大的小朋友偷了泥塑體積最小的小朋友的,理由是:偷的人泥塑體積會變大,被偷的變小。事實上,按照求最大最小值的算法,寫出來的程序也確實通過了,通過了,過了,了……

但細想,我還是認爲這道題出的不好,提供的證據只有“每個班都恰好有一個小朋友會去搶另一個小朋友的橡皮泥”,單有這個證據,無法完全斷言是誰偷了誰。

比如原來的分配是:

John:100cm3,Tom:80cm3,Mary:90cm3

後來,Tom偷了John泥塑5cm3,變成:

John:95cm3,Tom:85cm3,Mary:90cm3

按照最大最小值算的話,輸入第二組數據,答案是John偷了Tom的泥塑,與事實完全相反。通過體積就能計算誰偷了誰,也難怪小米老師只是幼兒園老師……所以實話說,在沒有提供更多的證據細節,這道題應該是無法求解。

如果有更好的算法的,請留言交流^_^

實現

下面禮貌性地給出代碼,我使用Java實現。

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;

class Student {
    String  name;       // 名字
    int     total;      // 泥塑體積
    public Student(int length, int width, int height, String name) {
        this.total = length * width * height;// 直接轉成體積
        this.name = name;
    }
}

public class Main {
    public static void main(String []args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        while (n > 0) {
            List<Student> stuList = new ArrayList<Student>();
            // 求體積最大最小值的下標
            for (int i = 0; i < n; i++) {
                stuList.add(new Student(sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.next()));
            }
            int minIndex = 0, maxIndex = 0;
            for (int i = 1; i < stuList.size(); i++) {
                if (stuList.get(i).total < stuList.get(minIndex).total) {
                    minIndex = i;
                }
                if (stuList.get(i).total > stuList.get(maxIndex).total) {
                    maxIndex = i;
                }
            }
            // 計算一次結果立即輸出
            System.out.println(stuList.get(maxIndex).name + " took clay from " + stuList.get(minIndex).name + ".");
            n = sc.nextInt();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章