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