Processing math: 100%

熱門文章

2025年4月19日 星期六

ZeroJudge 解題筆記:k253. 庫存清理 (Stock)

作者:王一哲
日期:2025年4月19日



ZeroJudge 題目連結:k253. 庫存清理 (Stock)

解題想法


有比較簡單、直接但行數很多的寫法,也可以用 for 迴圈合併重複的部分。

Python 程式碼


簡單直接但是行數很多的寫法,使用時間約為 19 ms,記憶體約為 3.4 MB,通過測試。
import sys

for line in sys.stdin:
    t, s, p = map(int, line.split())  # 商品初始數量、來店顧客數、商品單價
    d = t//5  # 1/5 的商品數量
    tot = 0  # 總金額
    while t >= d and s > 0:  # 還有可販售商品,還有顧客
        if t >= 4*d:  # 商品數量大於等於 4*d
            if s <= d+1:  # 人數小於等於 d+1
                tot += s*(p*5//10); s = 0; t -= s
            else:  # 人數大於 d+1
                tot += (d+1)*(p*5//10); s -= d+1; t -= d+1
        elif t >= 3*d:  # 商品數量大於等於 3*d
            if s <= d:  # 人數小於等於 d
                tot += s*(p*6//10); s = 0; t -= s
            else:  # 人數大於 d
                tot += d*(p*6//10); s -= d; t -= d
        elif t >= 2*d:  # 商品數量大於等於 2*d
            if s <= d:  # 人數小於等於 d
                tot += s*(p*8//10); s = 0; t -= s
            else:  # 人數大於 d
                tot += d*(p*8//10); s -= d; t -= d
        elif t >= d:  # 商品數量大於等於 d
            if s <= d:  # 人數小於等於 d
                tot += s*(p*9//10); s = 0; t -= s
            else:  # 人數大於 d
                tot += d*(p*9//10); s -= d; t -= d
    print(tot)

因為以上的程式碼有許多重複的地方,可以簡化成以下的樣子,使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
import sys

dis = (5, 6, 8, 9)  # 折扣
for line in sys.stdin:
    t, s, p = map(int, line.split())  # 商品初始數量、來店顧客數、商品單價
    d, tot, i = t//5, 0, 0  # 1/5 的商品數量,總金額,索引值
    while i < 4 and s > 0:  # i 小於 4,還有顧客
        n = d + (i==0)  # 這次最多可以販賣的數量,若 i 等於 0 時 n = d+1,否則 n = d
        tot += min(s, n)*(p*dis[i]//10); s -= min(s, n); t -= n; i += 1  # 數量取 s, n 較小值
    print(tot)


C++ 程式碼


使用時間約為 2 ms,記憶體約為 96 kB,通過測試。
#include <cstdio>
#include <algorithm>
using namespace std;

int main() {
    int dis[4] = {5, 6, 8, 9}, t, s, p;  // 折扣,商品初始數量、來店顧客數、商品單價
    while(scanf("%d %d %d", &t, &s, &p) != EOF) { 
        int d = t/5, tot = 0;  // 1/5 的商品數量,總金額
        for(int i=0; i<4 && s > 0; i++) {  // i 小於 4,還有顧客
            int n = d + (i==0);  // 這次最多可以販賣的數量,若 i 等於 0 時 n = d+1,否則 n = d
            tot += min(s, n)*(p*dis[i]/10); s -= min(s, n); t -= n;  // 數量取 s, n 較小值
        }
        printf("%d\n", tot);
    }
    return 0;
}


沒有留言:

張貼留言