标签:namespace code ret check ace const 代码 can 解法
设 \(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;
}
标签:namespace code ret check ace const 代码 can 解法
原文地址:https://www.cnblogs.com/Xray-luogu/p/12960774.html