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})\),可以通过本题。

posted @ 2023-08-13 10:43  _Unnamed  阅读(16)  评论(0)    收藏  举报