数据规模:1≤n≤100,1≤x≤109。
思路
买 3 送 1:每付 3 瓶的钱,最多能得到 4 瓶,等价于每 4 瓶里有 1 瓶免费。
设付费 p 瓶,则得到的总瓶数为 p+⌊p/3⌋。要使总瓶数至少 n,取
p=n−⌊4n⌋
按 nmod4 分类验证:
- n=4k:p=3k,得 4k=n 瓶;
- n=4k+1:p=3k+1,得 4k+1=n 瓶;
- n=4k+2:p=3k+2,得 4k+2=n 瓶;
- n=4k+3:p=3k+3,得 4k+4≥n 瓶。
若付费瓶数减 1,则每类情形得到的总瓶数都少于 n(分别少 2,1,1,1 瓶),因此 n−⌊n/4⌋ 就是最少的付费瓶数,答案为 (n−⌊n/4⌋)×x。
注意 x≤109、n≤100,答案最大约 1011,需用 64 位整数计算。
复杂度:时间 O(1),空间 O(1)。
仓颉实现
import std.env.*
import std.convert.*
main(): Int64 {
let reader = getStdIn()
let a = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p: String => Int64.parse(p) })
let n = a[0]
let x = a[1]
println((n - n / 4) * x)
return 0
}
要点:
n / 4 为整数除法,即 ⌊n/4⌋;直接乘以 x 即为最少花费。