熱門文章

2025年3月29日 星期六

ZeroJudge 解題筆記:g798. 帶動商機 (Business)

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



ZeroJudge 題目連結:g798. 帶動商機 (Business)

解題想法


這題按照題目敘述操作陣列即可,不需要用複雜的寫法。

Python 程式碼


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

for line in sys.stdin:
    arr = list(map(int, line.split()))[:-1]  # 讀取一開始的人數,刪掉最後的 0
    m = len(arr)  # 店家數量
    n = int(input())  # 更新 n 天
    for _ in range(n):  # 執行 n 次
        tmp = arr.copy()  # 暫存更新後的人數
        for i in range(m):  # 依序掃過 0 ~ m-1 家店
            if i == 0:  # 最左邊的店家
                if arr[i] > arr[i+1]:  # 如果人數大於右邊的店家
                    tmp[i+1] += arr[i]//10  # 右邊的店家人數增加量
            elif i == m-1:  # 最右邊的店家
                if arr[i] > arr[i-1]:  # 如果人數大於左邊的店家
                    tmp[i-1] += arr[i]//10  # 左邊的店家人數增加量
            else:  # 中間的店家
                if arr[i] > arr[i-1]:  # 如果人數大於左邊的店家
                    tmp[i-1] += arr[i]//20  # 左邊的店家人數增加量
                if arr[i] > arr[i+1]:  # 如果人數大於右邊的店家
                    tmp[i+1] += arr[i]//20  # 右邊的店家人數增加量
        arr, tmp = tmp, arr  # 交換 arr、tmp
    print(*arr)  # 印出答案


C++ 程式碼


使用時間約為 3 ms,記憶體約為 348 kB,通過測試。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int a;  // 暫存人數用的變數
    while(cin >> a) {
        vector<int> arr;  // 一開始的人數
        while(a != 0) {  // 讀取人數直到讀到 0 為止
            arr.push_back(a);
            cin >> a;
        }
        int m = (int)arr.size();  // 店家數量
        int n; cin >> n;  // 更新 n 天
        for(int i=0; i<n; i++) {  // 執行 n 次
            vector<int> tmp (arr.begin(), arr.end());  // 暫存更新後的人數
            for(int j=0; j<m; j++) {  // 依序掃過 0 ~ m-1 家店
                if (j == 0) {  // 最左邊的店家
                    if (arr[j] > arr[j+1]) tmp[j+1] += arr[j]/10;  // 如果人數大於右邊的店家,右邊的店家人數增加
                } else if (j == m-1) {  // 最右邊的店家
                    if (arr[j] > arr[j-1]) tmp[j-1] += arr[j]/10;  // 如果人數大於左邊的店家,左邊的店家人數增加
                } else {  // 中間的店家
                    if (arr[j] > arr[j-1]) tmp[j-1] += arr[j]/20;  // 如果人數大於左邊的店家,左邊的店家人數增加
                    if (arr[j] > arr[j+1]) tmp[j+1] += arr[j]/20;  // 如果人數大於右邊的店家,右邊的店家人數增加
                }
            }
            swap(arr, tmp);  // 交換 arr、tmp
        }
        for(int i=0; i<m; i++) cout << arr[i] << " \n"[i == m-1];  // 印出答案
    }
    return 0;
}


沒有留言:

張貼留言