当前位置: 代码迷 >> 综合 >> [codeforces 1360D] Buying Shovels
  详细解决方案

[codeforces 1360D] Buying Shovels

热度:49   发布时间:2024-01-06 08:45:14.0

题目见: 1360D
题意:给n把铁锹和一个数k,可以选择任意一个数1<= t <= k,每次都购买t个铁锹,求最少的购买次数。
思路:求n的最大的但不大于k的因数,n除以这个因数就是答案。可以想到的是:1.在k>=n的情况下,只需要购买1次。2.正常来说,为了找到1到k范围内n的最大的因数,我们需要遍历1到k,但是这样很容易导致超时。优化的方法是:遍历1~√k,如果能找到一个数x被n整除,这说明它是其因数。并且,n/x也是其因数。
例如第一组样例n=8,k=7
如果遍历1~7则是:
x=1, n%1=0, 8/1=8;
x=2, n%2=0, 8/2=4;
x=3…
x=4, n%4=0, 8/4=2;
n=5…6…7…
其中最大的因数是4,故而ans = 2;
但是如果遍历1~√7则是
x=1, n%1=0, 8/1=8, 8/(8/1)=1 (8>7 不成立);
x=2, n%2=0, 8/2=4, 8/(8/2)=2;
可以看到,当我们遍历到最小的因数的时候,其实也获得了对应的最大的因数。
只要这个相对小的因数对应的相对大的因数不大于k,我们就可以认为它对应的相对大的因数是最终的答案。

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;cin >> t;int a,b;while(t--){
    cin >> a >> b;if(b >= a ){
    cout << 1 << endl;continue;}else{
    int ans = a;for(int i = 1; i * i <= a; i++){
    
// cout << i << endl;if(a % i == 0 ){
    if(i <= b)ans = min(a/i,ans);if(a / i <= b)ans = min(ans, i);}}cout << ans << endl;}}return 0;
}