给你一个序列 a a a,你需要找到 m i n ( ∑ i = 1 i ≤ n ∣ a i − c i ∣ ) min(\sum_{i=1}^{i\leq n} |a_i-c^i|) min(∑i=1i≤n∣ai−ci∣)
我们可以暴力出所有的情况,我们假设全部都是 1 e 9 1e9 1e9的情况,那么和最多最多是 1 e 5 ∗ 1 e 9 1e5*1e9 1e5∗1e9,也就是 1 e 14 1e14 1e14
,因为 n ≥ 3 n\geq 3 n≥3,所以 i i i最大的情况就是 s q r t ( 1 e 14 ) sqrt(1e14) sqrt(1e14),所以就是遍历 1 1 1~ 1 e 7 1e7 1e7,但是期间如果出现 i n > 1 e 14 i ^n>1e14 in>1e14的情况,那么就可以直接退出了,因为这已经是最大的情况了,然后就是计算出最小值。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T>
inline void read(T &ret) {
char c;
int sgn;
if (c = getchar(), c == EOF) return ;
while (c != '-' && (c < '0' || c > '9')) c = getchar();
sgn = (c == '-') ? -1:1;
ret = (c == '-') ? 0:(c - '0');
while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
ret *= sgn;
return ;
}
inline void outi(int x) {
if (x > 9) outi(x / 10);putchar(x % 10 + '0');}
inline void outl(ll x) {
if (x > 9) outl(x / 10);putchar(x % 10 + '0');}
const int maxn = 1e5 + 10;
ll a[maxn] = {
0};
ll inf = 1e15;
int main() {
int n; read(n);
for (int i = 1; i <= n; i++) read(a[i]);
sort(a + 1, a + n + 1);
ll ans = inf;
for (int i = 1; i <= sqrt(inf); i++) {
if (pow(i, n) > inf) break;
ll cnt = 0;
for (int j = 1; j <= n; j++) {
cnt += abs(pow(i, j - 1) - a[j]);
}
ans = min(ans, cnt);
}
printf("%lld\n", ans);
return 0;
}