日期: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;
}
沒有留言:
張貼留言