P14826 踩踩标 个人题解
题目大意
给定 \(n,k\),求所有满足 \(a*b+c=n\) 时 \(a+b+k*c\) 的最小值,要求 \(a,b,c\) 均为自然数。
Solution
首先我们考虑一个问题,最少枚举多少次可以把 \(a*b+c=n\) 所有的 \(a,b,c\) 全枚举出来,答案很显然是 \(\sqrt n\) 次,因为 \(b\) 可以表示为 \(n/a\),\(c\) 可以表示为 \(n-a*b\)。那么我们可以直接枚举所有的 \(a,b,c\) 然后把答案取最小就行了。当然注意一下,可以 \(a=b=0,c=n\),比如在 \(k=0\) 时,这种情况显然最优,那么我们最后只需要把这种情况与上面求出的答案取个最小值就可以了。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0' || c>'9'){
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0' && c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int T=read();
signed main(){
while(T--){
int n=read(),k=read();
int ans=LONG_LONG_MAX;
for(int a=1;a<=sqrt(n);a++){//枚举a,b,c
int b=n/a,c=n-a*b;
ans=min(ans,a+b+k*c);//统计答案
}
printf("%lld\n",min(ans,n*k));
//最后可能会存在比如如果k=0时,肯定a=b=0,c=n时最优
//那么我们在输出答案时与n*k取min就好了
}
return 0;
}

浙公网安备 33010602011771号