[codeforces 1360D] Buying Shovels

题目见: 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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值