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