日期:2025年6月16日
ZeroJudge 題目連結:o923. 陣列運算 (Array)
解題想法
我沒有想到比較快的作法,就是依照題目的規定處理陣列 1 或 2,直到輸出是 0 為止。
Python 程式碼
使用時間約為 29 ms,記憶體約為 3.8 MB,通過測試。
import sys
for line in sys.stdin:
a = list(map(int, line.split())) # 陣列 1
b = list(map(int, input().split())) # 陣列 2
c = 1 # 輸出的值,預設為 1
while c: # 當 c 不是 0,繼續執行
if c%2 == 1: # 如果上一輪輸出是奇數,處理陣列 1
if a[0]%3 == 0: # 如果 a[0] 可以被 3 整除
imax = max(a) # 找出陣列 1 的最大值
print(imax) # 印出 imax
c = imax # 重設輸出的值
for i in range(5): # 掃過 a,如果 a[i] 等於 imax 則除以 2
if a[i] == imax: a[i] = imax//2
else: # 如果 a[0] 不能被 3 整除
imin = 10000 # 最小值,預設為超出題目範圍的值
for x in a: # 依序掃過 a,找非 0 的最小值
if 0 < x < imin: imin = x
print(imin) # 印出最小值
c = imin # 重設輸出的值
for i in range(5): # 掃過 a,如果 a[i] 等於 imin 則減 1
if a[i] == imin: a[i] = imin-1
else: # 如果上一輪輸出是偶數,處理陣列 2
if b[0]%3 == 0: # 如果 b[0] 可以被 3 整除
imax = max(b) # 找出陣列 2 的最大值
print(imax) # 印出 imax
c = imax # 重設輸出的值
for i in range(5): # 掃過 b,如果 b[i] 等於 imax 則除以 2
if b[i] == imax: b[i] = imax//2
else: # 如果 b[0] 不能被 3 整除
imin = 10000 # 最小值,預設為超出題目範圍的值
for x in b: # 依序掃過 b,找非 0 的最小值
if 0 < x < imin: imin = x
print(imin) # 印出最小值
c = imin # 重設輸出的值
for i in range(5): # 掃過 b,如果 b[i] 等於 imin 則減 1
if b[i] == imin: b[i] = imin-1
C++ 程式碼
使用時間約為 2 ms,記憶體約為 92 kB,通過測試。
#include <cstdio>
using namespace std;
int main() {
int d; // 暫存資料用的變數
while(scanf("%d", &d) != EOF) {
int a[5], b[5], c = 1; // 陣列1,陣列 2,輸出的值預設為 1
a[0] = d;
for(int i=1; i<5; i++) scanf("%d", &a[i]);
for(int i=0; i<5; i++) scanf("%d", &b[i]);
while (c) { // 當 c 不是 0,繼續執行
if (c%2 == 1) { // 如果上一輪輸出是奇數,處理陣列 1
if (a[0]%3 == 0) { // 如果 a[0] 可以被 3 整除
int imax = 0; // 找出陣列 1 的最大值
for(int i=0; i<5; i++) {
if (a[i] > imax) imax = a[i];
}
printf("%d\n", imax); // 印出 imax
c = imax; // 重設輸出的值
for(int i=0; i<5; i++) { // 掃過 a,如果 a[i] 等於 imax 則除以 2
if (a[i] == imax) a[i] = imax/2;
}
} else { // 如果 a[0] 不能被 3 整除
int imin = 10000; // 最小值,預設為超出題目範圍的值
for(int i=0; i<5; i++) { // 依序掃過 a,找非 0 的最小值
if (a[i] > 0 && a[i] < imin) imin = a[i];
}
printf("%d\n", imin); // 印出最小值
c = imin; // 重設輸出的值
for(int i=0; i<5; i++) { // 掃過 a,如果 a[i] 等於 imin 則減 1
if (a[i] == imin) a[i] = imin-1;
}
}
} else { // 如果上一輪輸出是偶數,處理陣列 2
if (b[0]%3 == 0) { // 如果 b[0] 可以被 3 整除
int imax = 0; // 找出陣列 1 的最大值
for(int i=0; i<5; i++) {
if (b[i] > imax) imax = b[i];
}
printf("%d\n", imax); // 印出 imax
c = imax; // 重設輸出的值
for(int i=0; i<5; i++) { // 掃過 b,如果 b[i] 等於 imax 則除以 2
if (b[i] == imax) b[i] = imax/2;
}
} else { // 如果 b[0] 不能被 3 整除
int imin = 10000; // 最小值,預設為超出題目範圍的值
for(int i=0; i<5; i++) { // 依序掃過 b,找非 0 的最小值
if (b[i] > 0 && b[i] < imin) imin = b[i];
}
printf("%d\n", imin); // 印出最小值
c = imin; // 重設輸出的值
for(int i=0; i<5; i++) { // 掃過 b,如果 b[i] 等於 imin 則減 1
if (b[i] == imin) b[i] = imin-1;
}
}
}
}
}
return 0;
}
沒有留言:
張貼留言