#include<iostream> #include<algorithm> using namespace std; const int N=1e6+10; int a[N]; int main() { int n; cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; sort(a+1,a+n+1); int ans=0,x=a[(n-1)/2+1]; for(int i=1;i<=n;i++) { if(i!=(n-1)/2+1) { ans+=abs(x-a[i]); } } cout<<ans<<endl; }
经典的贪心问题,如果有一个商店,那一定是建在商店上,距离之和最小,如果有两个商店,那一定要建在两个商店之间。
如果有三个商店,一定要建在中间的商店上面。用公式来推导的话,就是每个点到c的绝对值之和最小,把所有这样的式子
分成两组类似|a[n]-c|+|a[1]-c|的两组,这个式子值最小是建在中间,所以建在最中间一定是最小的。