读完题后根据数学直觉可以感觉到答案在这些商店的中点附近,但不能确定其就是中点,那我们可以先确定中点,然后比较中点和它左边和右边的点与商店的距离,如果左右都比中点大即可确定是中点如果有一边比中点小那就往小的那边移动到数值开始增大为止
#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;
}