题目链接
思路:
从1开始枚举c的大小再用一个循环从1跑到n枚举c的每一个次方,再求出需要操作的最小值即可,如果c的某个次方和a[i]的差超出1e15(数据范围内能够操作的最大值)那么这个c之后的c就不可能了,直接break然后输出之前求得的最小值即可。
代码:
#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=1e5+9;
const int M=1e4+5;
const double eps=1e-8;
const int mod=1e9+7;
const int inf=0x7fffffff;
const double pi=3.1415926;
using namespace std;
int a[N];
signed main()
{
IOS;
int n,m=1;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
int res=1e18;
for(int c=1;;c++)
{
int sum=0,now=1;
for(int i=1;i<=n;i++)
{
sum+=abs(a[i]-now);
now*=c;
if(now>=1e15)
{
now=-1;
break;
}
}
if(now==-1)
{
break;
}
else
{
res=min(res,sum);
}
}
cout<<res<<endl;
return 0;
}