Buying Shovels 题解
解题思路
首先观察数据范围,\(1 \le k , n \le 10^9\),暴力枚举已经不现实了,需要想出更优秀的算法。
从数据规模入手:
\[\begin{aligned} &n \leq 10^9\\ &k \leq 10^9 \end{aligned}
\]
可以推测:对于一个数 \(n\),买 \(k\) 支铲子包肯定太多(针对特定的 \(n\) 和 \(k\) 能否证明一下呢?欢迎评论区讨论一下),因此所购买的包装物品数量最大值 \(\geq1\),最小值 \(\leq\sqrt{n}\)。
考虑如下方法:
对于每个数 \(i (1 \le i \le \sqrt{n})\),计算 \(n / i\)。显然如果 \(i\) 是 \(n\) 的因数之一,那么 \(t \times i\)( \(t\) 为任意数)也是 \(n\) 的因子之一。记 \(x=n/i\),则共需要购买 \((x - n/x) \times i\) 个包装物品。
选出这些包装物品总量中最小的即可。
该算法时间复杂度为 \(\sqrt{n}\),可以通过本题。
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int t, n, k;
int main() {
cin >> t;
while (t--) {
cin >> n >> k;
int ans = n;
for (int i = 1; i <= sqrt(n); ++i)
if (n % i == 0) {
if (i <= k)
ans = min(ans, n / i);
if (n / i <= k)
ans = min(ans, i);
}
cout << ans << endl;
}
return 0;
}
时间复杂度 \(O(t\sqrt{n})\),可以通过本题。

浙公网安备 33010602011771号