熱門文章

2025年9月30日 星期二

ZeroJudge 解題筆記:e698. OREOREO!

作者:王一哲
日期:2025年9月30日


ZeroJudge 題目連結:e698. OREOREO!

解題想法


我先計算 O 的部分較寬及 RE 的部分較寬兩種狀況下,分別要印出的 O 及 RE 的字串。接下來讀取 n 塊餅乾的組成方式,依序輸出每一塊餅乾對應的形狀。

Python 程式碼


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

for line in sys.stdin:
    w1, h1 = map(int, line.split())
    w2, h2 = map(int, sys.stdin.readline().split())
    c1, c2 = sys.stdin.readline().split()
    if w1 > w2:  # O 的部分較寬
        O = c1*w1
        RE = " "*((w1-w2)//2) + c2*w2
    else:  # RE 的部分較寬
        O = " "*((w2-w1)//2) + c1*w1
        RE = c2*w2
    n = int(sys.stdin.readline())  # 接下來有 n 塊餅乾
    for _ in range(n):  # 執行 n 次
        cookie = sys.stdin.readline().strip()  # 餅乾的組成
        i = 0  # 從 cookie 讀取資料用的索引值
        while i < len(cookie):  # 如果 i 還沒有出界時繼續執行
            if cookie[i] == "O":  # 如果是 O
                for _ in range(h1): print(O)  # 印出 h1 行的 O
                i += 1  # i 加 1
            elif cookie[i] == "R":  # 如果是 RE
                for _ in range(h2): print(RE)  # 印出 h2 行的 RE
                i += 2  # i 加 2
        print()  # 跑完一塊餅乾要換行


C++ 程式碼


使用時間約為 4 ms,記憶體約為 328 kB,通過測試。
#include <iostream>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int w1, h1, w2, h2;
    char c1, c2;
    while(cin >> w1 >> h1) {
        cin >> w2 >> h2;
        cin >> c1 >> c2;
        string O = "", RE = "";
        if (w1 > w2) {  // O 的部分較寬
            for(int i=0; i<w1; i++) O += c1;
            for(int i=0; i<(w1-w2)/2; i++) RE += ' ';
            for(int i=0; i<w2; i++) RE += c2;
        } else {  // RE 的部分較寬
            for(int i=0; i<(w2-w1)/2; i++) O += ' ';
            for(int i=0; i<w1; i++) O += c1;
            for(int i=0; i<w2; i++) RE += c2;
        }
        int n; cin >> n;  // 接下來有 n 塊餅乾
        for(int i=0; i<n; i++) {  // 執行 n 次
            string cookie; cin >> cookie;  // 餅乾的組成
            int j = 0;  // 從 cookie 讀取資料用的索引值
            while(j < (int)cookie.size()) {  // 如果 j 還沒有出界時繼續執行
                if (cookie[j] == 'O') {  // 如果是 O
                    for(int k=0; k<h1; k++) cout << O << "\n";  // 印出 h1 行的 O
                    j++;  // j 加 1
                } else if (cookie[j] == 'R') {  // 如果是 RE
                    for(int k=0; k<h2; k++) cout << RE << "\n";  // 印出 h2 行的 RE
                    j+=2;  // j 加 2
                }
            }
            cout << "\n";  // 跑完一塊餅乾要換行
        }
    }
    return 0;
}


沒有留言:

張貼留言