AcWing 104. 货仓选址
原题链接
简单
距离最小问题:绝对值不等式问题,中位数为最佳解。
写法1.$O(nlogn)$
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;//const定义变量,后面使用不允许修改。
int n;
int a[N];
int main(){
cin >> n;
int res=0;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) res += abs(a[i]-a[n/2]);//其中a[n/2]是货仓应在的位置。
cout<<res;
return 0;
}
写法2.$O(nlogn)$
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;//const定义变量,后面使用不允许修改。
int n;
int a[N];
int main(){
cin >> n;
int res=0;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
for(int i=0;i<n;i++) res += a[i]-a[i/2];//其中a[n/2]是货仓应在的位置。
cout<<res;
return 0;
}
写法3.$O(n)$
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;//const定义变量,后面使用不允许修改。
int n;
int a[N];
int main(){
cin >> n;
int res=0;
for(int i=0;i<n;i++) cin>>a[i];
nth_element(a,a+n/2,a+n);//nth_element函数解释:第一个位置表示要迭代的起始位置,第二位置表示要找到的目标数,第三个位置表示迭代的结束位置。
for(int i=0;i<n;i++) res += abs(a[i]-a[n/2]);//其中a[n/2]是货仓应在的位置。
cout<<res;
return 0;
}