AtCoder Regular Contest 100 C - Linear Approximation

 

 题意 给你一堆x轴上的点

然后让你在x轴找一个点,使所有点到他的距离总和最小

考虑之前那个所有点都是x,y表示的题

那个题显然是个二次函数

这个题也是求距离,就套三分算一算,

#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define io std::ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
const double pi=acos(-1);
const ll P = 998244353, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n){ll r=1%P;for (a%=P; n; a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
const double eps=1e-5;
ll lcm(ll a,ll b){return a*b/gcd(a,b);}
const int maxn=2e5+10;
int a[maxn];
int n;
ll check(int x)
{ 
  ll ans=0;
  for(int i=1;i<=n;i++)
  { 
        ans+=abs(a[i]-x);
  }
  return ans;
}

int main()
{
  cin>>n;
  int l=-1e9,r=1e9;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
    a[i]-=i;
  }
  while(l<r-1)
  {
    int midl=l+r>>1;
    int midr=midl+r>>1;
    if(check(midl)>check(midr)) l=midl;
    else r=midr;
  }
  cout<<min(check(l),check(r))<<endl;//然后这地方有个问题啊,最后再取一下l,r
}

 

posted @ 2020-09-09 20:31  摸鱼选手LLF  阅读(185)  评论(0编辑  收藏  举报