添加链接描述
思路: 这道题关键是要读懂题目。我们知道一个整数序列,同样题目中说明我们可以免费排序,那么根据等比数列的特征,我们肯定会选择从小到大排序。所以我们关键是要确定公比 c ,那么我们可以通过暴力枚举来解决,取成本消耗最少的值。 要注意优化时间,由于我们是不断增加公比去求成本消耗最小值,倘若我们再增加公比的值求得的成本消耗比上一次的还要高,那么这个时候我们就必须要退出了,因为之后再增加还是一样的情况。
这个题很好,观察到2的62次方已经快到1e18了,而a的范围是1e9以内,所以循环的次数不会太多,递增递减的边界循环几次就找到了,所以直接暴力跑,如果发现开始递增直接退出。
而且这题代码细节也很重要,把判断if(sum>ans)放在内层循环,否则会ll溢出
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+5;
const ll INF=1e15;
ll a[maxn];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int c=1;
ll ans=INF;
while(1)
{
ll sum=0,te=1;
sum=a[0]-1;
for(int i=1;i<n;i++)
{
te*=c;
sum+=abs(a[i]-te);
if(sum>ans)
break;
}
if(sum<=ans)
{
ans=sum;
c++;
}
else break;
}
cout<<ans<<endl;
return 0;
}