若购买长度为 n+1n+1n+1 的圆木,并用它切出长度为 1,2,…,k1,2,\ldots,k1,2,…,k 的圆木,必须有 1+2+⋯+k≤n+11+2+\cdots+k\le n+11+2+⋯+k≤n+1。
取满足该不等式的最大 kkk,再直接购买长度为 k+1,k+2,…,nk+1,k+2,\ldots,nk+1,k+2,…,n 的圆木,总花费为 n−k+1n-k+1n−k+1。任何更便宜的方案都必须用某根已购买的圆木代替更多的短圆木,而长度 n+1n+1n+1 最大,能代替的最短前缀最长,因此上述方案最优。
在 [0,n+1][0,n+1][0,n+1] 上二分最大的 kkk,判定 k(k+1)/2≤n+1k(k+1)/2\le n+1k(k+1)/2≤n+1。乘法使用 __int128 避免溢出。
__int128
时间复杂度为 O(logn)O(\log n)O(logn),空间复杂度为 O(1)O(1)O(1)。
注册一个 Hydro 通用账户,您就可以在我们提供的所有在线评测服务上提交代码、参与讨论。
使用您的 Hydro 通用账户