解题思路:
找到中位数的点即为所求。
找出一条线,能把点连起来切最短,连接方式如图
找出每个坐标的最小值和最大值,在这所有的点里面找到最中间的那个就是答案
#include<bits/stdc++.h>
using namespace std;
int l[100100];
int r[100100];
int a[200100];
int main()
{
int n,m,k;
cin>>n>>m>>k;
memset(l,0x3f3f3f,sizeof(l));
memset(r,-1,sizeof(r));
for(int i=1;i<=k;i++)
{
int x;
cin>>x>>a[i];
l[x]=min(l[x],a[i]);
r[x]=max(r[x],a[i]);
}
k=0;
for(int i=0;i<n;i++)
{
if(r[i]<0) continue;
a[++k]=l[i];
a[++k]=r[i];
}
sort(a+1,a+k+1);
long long res=n-1;
for(int i=0;i<n;i++)
{
if(r[i]<0) continue;
if(a[k/2]<=l[i]) res+=(r[i]-a[k/2])*2;
else if(a[k/2]>=r[i]) res+=(a[k/2]-l[i])*2;
else res+=(r[i]-l[i])*2;
}
cout<<res<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=100100;
int a[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
long long res=0;
for(int i=1;i<=n;i++) res+=abs(a[i]-a[(n+1)/2]);
cout<<res<<endl;
return 0;
}