熱門文章

2025年4月5日 星期六

ZeroJudge 解題筆記:i069. 岩石觀察 (Stones)

作者:王一哲
日期:2025年4月5日



ZeroJudge 題目連結:i069. 岩石觀察 (Stones)

解題想法


因為 Python 會一次讀取整行的資料,存成串列後再找最大值、最小值。C++ 一次讀取一筆資料,可以在讀取所有盒子的資料時一邊找最大值、最小值。

Python 程式碼


使用時間約為 19 ms,記憶體約為 3.3 MB,通過測試。
import sys

for line in sys.stdin:
    n = int(line)  # n 個盒子
    box = list(map(int, input().split()))  # 原來的數量
    avg = sum(box)//n  # 平均數量
    pmax = box.index(max(box))  # 數量最多的盒子編號
    pmin = box.index(min(box))  # 數量最少的盒子編號
    d = box[pmax] - avg  # 移動的數量
    box[pmax] -= d  # 減少 d
    box[pmin] += d  # 增加 d
    print(*box)  # 印出答案


C++ 程式碼


使用時間約為 2 ms,記憶體約為 88 kB,通過測試。
#include <cstdio>
using namespace std;

int main() {
    int n;  // n 個盒子
    while(scanf("%d", &n) != EOF) {
        // 原來的數量 box,平均數量 avg 先拿來算加總,最大值、最小值及對應的索引值
        int box[n], avg = 0, imax = 0, imin = 100000, pmax = 0, pmin = 0; 
        for(int i=0, b; i<n; i++) {  // 執行 n 次,暫存數量 b
            scanf("%d", &b);
            box[i] = b;
            avg += b;
            if (b > imax) {
                imax = b; pmax = i;
            }
            if (b < imin) {
                imin = b; pmin = i;
            }
        }
        avg /= n;  // 平均數量
        int d = box[pmax] - avg;  // 移動的數量
        box[pmax] -= d;  // 減少 d
        box[pmin] += d;  // 增加 d
        for(int i=0; i<n; i++) {  // 印出答案
            printf("%d", box[i]);
            if (i == n-1) printf("\n");
            else printf(" ");
        }
    }
    return 0;
}


沒有留言:

張貼留言