货仓选址(贪心)(也可以二分)(还可以三分)

货仓选址(贪心)

题目大意:给你N个位置(在同一条轴上的),求出在这些位置中的一个位置,使得所有位置到这个位置的和最小

利用贪心思想,如果选取的位置不在中心,那么向左或者向右移动的距离之和的增量是不同的,有正数有负数,只有当选取的位置在中心的时候才会让选取的位置不管向左还是向右移动增量都为正数,所以中间是最好的位
////这道题目其实二分也可以写,只要控制好精度问题,在输出的时候输出整数部分;

AC代码(版本一)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std;
const int maxn=100010;
int num[maxn];
int main(void)
{
    int N;scanf("%d",&N);
    for(int i=0;i<N;i++)scanf("%d",&num[i]);
    sort(num,num+N);
    ll ans=0;
    for(int i=0;i<N;i++)
        ans+=abs(num[i]-num[N>>1]);
    cout<<ans<<endl;
    return 0;
}

(版本二)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define ll long long
using namespace std;
const int maxn=100010;
int num[maxn];
int main(void)
{
    int N;scanf("%d",&N);
    for(int i=0;i<N;i++)scanf("%d",&num[i]);
    sort(num,num+N);
    ll ans=0;
    for(int i=0;i<N;i++)
        ans+=num[i]-num[i>>1];//不断的改变中间的位置,每次的改变都只会增加新的点到中间位置的距离
    cout<<ans<<endl;
    return 0;
}
posted @ 2022-09-27 20:54  WUTONGHUA02  阅读(18)  评论(0编辑  收藏  举报