题意:每次操作对一个数加一或减一,最少操作几次使得序列为幂序列。
题解:枚举底数,升序,计算每个底数的幂序列和原序列各项差值的绝对值之和,当差值之和开始增加时,底数再加下去只会使差值越来越大,所以将差值之和作为边界条件。虽然有两个循环,但枚举底数的次数应该不会多,故可行。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100010];
int main()
{
ios::sync_with_stdio(0);
int n, i, j;ll mmin = 0;cin >> n;
for (i = 1; i <= n; i++)
cin >> a[i], mmin += a[i];
sort(a + 1, a + 1 + n);
mmin -= n;//1为底数
for (i = 2; ; i++){
ll sum = 0, num = 1;
for (j = 1; j <= n; j++){
if (num * i >= 1e18) break;//防止溢出
sum += abs(num - a[j]), num *= i;
}
if (sum < mmin) mmin = sum;
else break;
}
cout << mmin << endl;
}