codeforces B. Power Sequence

codeforces B. Power Sequence_第1张图片

题目

题意:

给你一个序列 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=1inaici)

思路:

我们可以暴力出所有的情况,我们假设全部都是 1 e 9 1e9 1e9的情况,那么和最多最多是 1 e 5 ∗ 1 e 9 1e5*1e9 1e51e9,也就是 1 e 14 1e14 1e14
,因为 n ≥ 3 n\geq 3 n3,所以 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;
}

你可能感兴趣的:(codeforces)