题解:P9863 [POI 2021/2022 R2] arm
思路
我们发现,最优策略一定是先进行选择
那么我们设当前物品数量为
所以最后的结果一定为
因此,我们可以枚举
对于每个
设
最后的答案即为最小的
但是,注意到有可能会有浮点误差 pow(n, 1.0 / k) 或溢出问题,因此要加上一句 return LONG_LONG_MAX;。其实本应该写二分的,但是本人不会写,加个特判也能过。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,a,b,ans=LONG_LONG_MAX;
int solve(){
int num=pow(n,1.0/k);
for(int i=k;i>=0;i--){
int sum=1,cst=0;
for(int j=1;j<=i;j++){
sum*=num;
cst+=(num-1);
}
for(int j=i+1;j<=k;j++){
sum*=(num+1);
cst+=num;
}
if(sum>=n||sum<0) return b*cst+a*k;
}
return LONG_LONG_MAX;
}
signed main(){
cin>>n>>a>>b;
n++;
for(int i=1;i<=64;i++){
k=i;
int t=solve();
if(t>=0) ans=min(ans,t);
}
cout<<ans;
return 0;
}