熱門文章

2025年6月16日 星期一

ZeroJudge 解題筆記:o923. 陣列運算 (Array)

作者:王一哲
日期: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;
}


沒有留言:

張貼留言