[R69A] 包装

  • 难度 入门
  • 时限 1s
  • 空限 512m
  • 数学

数据规模:1≤n,x≤10001 \le n, x \le 1000。

思路

一次「装 xx 瓶」的操作等价于 xx 次「装 1 瓶」,但只花 1 次操作,所以第一种方式用得越多越好。最多能用 ⌊n/x⌋\lfloor n/x \rfloor 次第一种方式,剩下的 n mod xn \bmod x 瓶用第二种方式逐瓶装,总操作数为

⌊nx⌋+n mod x\left\lfloor \frac{n}{x} \right\rfloor + n \bmod x

x>nx > n 时 ⌊n/x⌋=0\lfloor n/x \rfloor = 0,退化为全部单瓶包装,公式同样成立。

复杂度:时间 O(1)O(1),空间 O(1)O(1)。

仓颉实现

查看仓颉实现
import std.env.*
import std.convert.*

main() {
    let reader = getStdIn()
    let nx = reader.readln().getOrThrow().split(" ", removeEmpty: true).map({ p => Int64.parse(p) })
    let n = nx[0]
    let x = nx[1]
    println(n / x + n % x)
}

要点:

  • 贪心正确性:设第一种方式用了 kk 次,总操作数为 k+(n−kx)=n−k(x−1)k + (n - kx) = n - k(x-1),随 kk 单调递减,故 kk 取最大值 ⌊n/x⌋\lfloor n/x \rfloor。