AcWing 104. 货仓选址
原题链接
简单
作者:
满目星河_0
,
2021-04-09 12:28:09
,
所有人可见
,
阅读 280
货仓选址(超详细注释)
//算法思想:首先需要对商店坐标进行排序,根据贪心思想,货仓在中点的时候为最优解。
//我们只需要确定货仓左侧和右侧商店的数量就可以了,确保货舱左侧和右侧的数量相差的数量最小,也就是
//说货舱放置位置的最优解是在一个范围内,分两种情况进行讨论:mid表示货仓位置,n表示商店数量。
//1.当商店数量是奇数时,我们直接把货舱放在中点商店的位置。mid=n/2+1;
//2.当商店数量是偶数时,我们只需要把货舱放在中点附近的左右两点的区间内(包括左右两点本身,干脆直
//接放在左侧的那个点上,方便计算。mid=n/2
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=100010;
int a[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);//对商店坐标进行排序
int mid;//mid货舱位置
if(n%2==0) mid=n/2; //商店个数为偶数时
else mid=n/2+1;//商店个数为奇数时
int s=a[mid];//货仓放置的位置
int res=0;
for(int i=1;i<=mid;i++) res+=s-a[i]; //加上mid左侧的距离
for(int i=mid+1;i<=n;i++) res+=a[i]-s;//加上mid右侧的距离
cout<<res;//输出距离总和
return 0;
}