[R69A] 包装

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

数据规模:1n,x10001 \le n, x \le 1000

思路

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

nx+nmodx\left\lfloor \frac{n}{x} \right\rfloor + n \bmod x

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

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

仓颉实现

import std.env.*
import std.convert.*

main(): Int64 {
    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)
    return 0
}

要点:

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