C - Linear Approximation【中位数变形】

C - Linear Approximation

题意:求sigma abs(a[i]-i-b)的最小值

思路:中位数变形,a[i]-i当做新的a[i]

#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
#define F first
#define S second
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int MOD=1e9+7;
ll a[N];
//struct node{
//    ll v;
//    ll d;
//}p[N];
//ll sum;
//ll ans[N];

int main(void){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n;
    cin >>n;
    for(int i=1;i<=n;i++)   cin >>a[i],a[i]-=i;
    sort(a+1,a+1+n);
    ll mid=n/2;
    ll b[4]={a[mid],a[mid+1],a[mid-1]};
    ll ans=1e18;
    for(int i=0;i<=2;i++){
        ll tb=b[i];
        ll res=0;
        for(int j=1;j<=n;j++){
            res+=abs(a[j]-tb);
        }
        ans=min(ans,res);
    }
    cout << ans << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/haipai1998/article/details/80891065
今日推荐