猜的是中间,但经过思考后觉得应该左右尝试一下
#include<iostream>
#include<math.h>
using namespace std;
int right(int q,int p,int m,int a[],int N){
q=p;
m=m+1;
p=0;
for(int i=0;i<N;i++)
{
p=p+abs(a[i]-(m+1));
}
if(p>=q){
return q;
}else{
return right(q,p,m,a,N);
}
}
int left(int q,int p,int m,int a[],int N){
q=p;
m=m-1;
p=0;
for(int i=0;i<N;i++)
{
p=p+abs(a[i]-(m-1));
}
if(p>=q){
return q;
}else{
return left(q,p,m,a,N);
}
}
int main(){
int mid,x,y,z,N,a[99999],max=0,min=100000;
cin>>N;
for(int i=0;i<N;i++){
cin>>a[i];
if(a[i]<min){
min=a[i];
}
if(a[i]>max){
max=a[i];
}
mid=(max+min)/2;
}
for(int i=0;i<N;i++){
x=x+abs(a[i]-mid);
y=y+abs(a[i]-(mid+1));
z=z+abs(a[i]-(mid-1));
}
if(x<=y&&x<=z){
cout<<x;
}else if(x>y){
cout<<right(x,y,mid,a,N);
}else if(x>z){
cout<<left(x,z,mid,a,N);
}
return 0;
}