CF1360D

题目大意

  • (k) 种包裹
  • (i) 种包裹中有 (i) 个物品((1le ile k)
  • 需要购买 恰好 (n) 个物品
  • 只能购买一种包裹,但是可以购买无数次该包裹
  • 问最少的购买次数

解法

(m=min{lfloor sqrt{n} floor,k}),其意义是买若干次包裹后 可能 得到 恰好 (n) 个物品 的最小购买次数 的最大值(因为若有一个数 (a)(n) 的因子,必然有 (ale lfloorsqrt{n} floor))。
故从 (1sim m) 枚举,统计答案即可。复杂度 (tsqrt{n})

代码

#include <bits/stdc++.h>
#define ll long long
const int INF=0x3f3f3f3f;
//const ll INF=0x3f3f3f3f3f3f3f3fll;
using namespace std;
void rdt(int&),solve();
int check(int);
int n,k;
int main() {
    int t; rdt(t);
    for (;t;t--) solve();
    return 0;
}
void rdt(int& t) {
    //t=1;
    scanf("%d",&t);
}
void solve() {
    scanf("%d%d",&n,&k);
    if (k>=n) {puts("1"); return;}
    int m=min((int) sqrt(n),k);
    printf("%d
",check(m));
}
int check(int nn) {
    int ret=INF;
    for (int i=nn;i;i--) {
        if (n%i) continue;
        int x=i,y=n/i;
        ret=min(ret,n/x);
        if (y<=k) ret=min(ret,n/y);
    }
    return ret;
}
原文地址:https://www.cnblogs.com/Xray-luogu/p/12960774.html