CF1360D - Buying Shovels 題解

題目大意

  • \(k\) 種包裹
  • \(i\) 種包裹中有 \(i\) 個物品(\(1\le i\le k\)
  • 需要購買 恰好 \(n\) 個物品
  • 只能購買一種包裹,但是可以購買無數次該包裹
  • 問最少的購買次數

解法

\(m=\min\{\lfloor \sqrt{n}\rfloor,k\}\),其意義是買若干次包裹後 可能 得到 恰好 \(n\) 個物品 的最小購買次數 的最大值(因爲若有一個數 \(a\)\(n\) 的因子,必然有 \(a\le \lfloor\sqrt{n}\rfloor\))。
故從 \(1\sim m\) 枚舉,統計答案即可。複雜度 \(t\sqrt{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\n",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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章