前言
点赞数达到114(警撅)了,我猜应该没人打破他
if(有人点赞){
while(true){
蒟蒻开心!;
}
}
题目描述
在一条数轴上有 N 家商店,它们的坐标分别为 A[1]∼A[N]。
现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。
为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
输入格式
第一行输入整数 N。
第二行 N 个整数A[1]∼A[N]。
输出格式
输出一个整数,表示距离之和的最小值。
输入数据 1
4
6 2 9 1
输出数据 1
12
数据范围
1 ≤ N ≤ 100000,0 ≤ A[i] ≤ 40000
题解
不难发现A[i]的范围不大,我们可以加个桶避免超时。而且,这个距离之和在一定范围内具有单调性,可以二分(吧)。蒟蒻不想用二分,用O(n)的时间过了----懒得介绍那么多了,应该也没人看
#include<bits/stdc++.h>
using namespace std;
int a[114514],t[114514];
int main(){
int n,sum=0,x,y,maxn=-1,ans;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>maxn)maxn=a[i];
t[a[i]]++;
sum+=a[i];
}
ans=sum;
x=t[0];y=n-t[0]; //x为增加 y为减少
for(int i=1;i<=maxn;i++){
sum+=x;
sum-=y;
x+=t[i];
y-=t[i];
if(ans>sum)ans=sum;
}
cout<<ans;
return 0;
}