熱門文章

2025年3月31日 星期一

ZeroJudge 解題筆記:h034. 宴會 (Banquet)

作者:王一哲
日期:2025年3月31日



ZeroJudge 題目連結:h034. 宴會 (Banquet)

解題想法


這題在 Python 可以 itertools.zip_longest 會比較方便。

Python 程式碼


只使用預設工具的寫法,使用時間約為 53 ms,記憶體約為 5.9 MB,通過測試。
import sys

for line in sys.stdin:
    n = int(line)  # 餐廳總數
    food = [input().strip() for _ in range(n)]  # 儲存各餐廳的菜單
    m = max([len(f) for f in food])  # 最長的菜單數量
    for i in range(m):  # 處理 m 次
        for j in range(n):  # 印出各家餐廳的菜名
            if i < len(food[j]) and food[j][i].isupper():  # 如果 i 還沒有出界而且 food[j][i] 是大寫字母
                print(food[j][i], end="")  # 印出這個字母
    print()  # 全部跑完再換行

Python 中有一個 zip 工具,用來將數個可以迭代的物件綁在一起輸出,但是 zip 會以這些物件中最短的一個作為輸出的上限,其它較長的部分會被捨去。如果要以最長的物件作為輸出的上限,要用 itertools.zip_longest,長度不夠的部分會補 None。使用時間約為 55 ms,記憶體約為 6 MB,通過測試。
import sys
from itertools import zip_longest

for line in sys.stdin:
    n = int(line)  # 餐廳總數
    food = [input().strip() for _ in range(n)]  # 儲存各餐廳的菜單
    for f in zip_longest(*food):  # 先將 food 拆開成多個一維串列,用 zip_longest 綁在一起依序輸出
        for c in f:  # 依序由 f 讀取各家餐廳的菜名
            if c != None and c.isupper():  # 如果 c 不等於 None 而且是大寫字母
                print(c, end="")  # 印出這個字母
    print()  # 全部跑完再換行


C++ 程式碼


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

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n;  // 餐廳總數
    while(cin >> n) {
        string food[n];  // 儲存各餐廳的菜單
        int m = 0;  // 最長的菜單數量
        for(int i=0; i<n; i++) {  // 讀取並儲存各餐廳的菜單,更新 m
            string s; cin >> s;
            food[i] = s;
            if ((int)s.size() > m) m = (int)s.size();
        } 
        for(int i=0; i<m; i++) {  // 處理 m 次
            for(int j=0; j<n; j++) {  // 印出各家餐廳的菜名
                if (i < (int)food[j].size() && isupper(food[j][i])) {  // 如果 i 還沒有出界而且 food[j][i] 是大寫字母
                    cout << food[j][i];  // 印出這個字母
                }
            }
        }
        cout << "\n";  // 全部跑完再換行
    }
    return 0;
}


沒有留言:

張貼留言