题目链接:https://codeforces.com/contest/1397/problem/B
思路:枚举从1开始枚举c的值,当发现耗费变大,及跳出输出最小的即为答案
实质:是用
c
i
c^i
ci拟合一条曲线
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long
const int maxn=1e5+5;
int a[maxn];
int n;
long long ans=inf;
int check(int c){ //暴力枚举每一种幂c的情况
long long sum=0;
long long now=1;
for(int i=0;i<n;i++){
sum+=abs(a[i]-now);
now*=c;
if(sum>ans) return 0; //如果值变大了,直接输出
}
ans=min(ans,sum); //如果值变小了,进行更新
return 1;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
ans=1e13;
for(int c=1;;c++){
int flag=check(c);
if(!flag) {
cout<<ans;
return 0;
}
}
}