原题链接: https://codeforces.com/contest/1397/problem/B
测试样例:
input
3
1 3 2
output
1
input
3
1000000000 1000000000 1000000000
output
1999982505
Note
In the first example, we first reorder {1,3,2} into {1,2,3}, then increment a2 to 4 with cost 1 to get a power sequence {1,2,4}.
题意: 给你一个整数序列,你可以先更改整数序列的顺序,之后,你可以对任意位置的元素进行+1-1操作,成本消耗为1.问变成一个等比数列的最小成本是多少?
解题思路: 这道题关键是要读懂题目。我们知道一个整数序列,同样题目中说明我们可以免费排序,那么根据等比数列的特征,我们肯定会选择从小到大排序。那么由于 a i = c i a_i=c^i ai=ci,所以我们关键是要确定公比 c c c,那么我们可以通过暴力枚举来解决,取成本消耗最少的值。 要注意优化时间,由于我们是不断增加公比去求成本消耗最小值,倘若我们再增加公比的值求得的成本消耗比上一次的还要高,那么这个时候我们就必须要退出了,因为之后再增加还是一样的情况。
AC代码:
#include<bits/stdc++.h> //POJ不支持
#define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增
#define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
#define fi first
#define se second
#define mp make_pair
using namespace std;
const long long inf = 1e15;//无穷大
const int maxn = 1e5+3;//最大值。
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
//
int n;
ll a[maxn];
void calculate(){
ll result=inf;
ll ans,temp;
for(ll i=1;i<=1000004;i++){
ans=a[0]-1;
temp=1;
bool flag=true;
for(ll j=1;j<n;j++){
temp*=i;
ans+=abs(a[j]-temp);
if(ans>result){
flag=false;
break;
}
}
if(!flag)break;
result=min(result,ans);
}
cout<<result<<endl;
}
int main(){
//freopen("in.txt", "r", stdin);//提交的时候要注释掉
IOS;
while(cin>>n){
rep(i,0,n-1)
cin>>a[i];
sort(a,a+n);
calculate();
}
return 0;
}