(货仓选址问题)在数轴上选一点,使得该点到其他点的距离和最小
结论:选择该组数字的中位数即可,

结论:选择该组数字的中位数即可,
一共n个数,当n为奇数时,中位数【(n+1)/2】,当n为偶数时,a【(n+1)/2】~a【(n+1)/2+1】之内的数皆可
这个题目出现至少,八成就是二分
那么证明下天数是分成两段的
设第x天恰好(最少)满足要求,那么第x+1天,有一个苗增高导致不完美,那么我们可以用减一的办法让它恢复
这样x后面的天都可以变成腕足条件的
所以二分天数是可以的
那么证明下天数是分成两段的
设第x天恰好(最少)满足要求,那么第x+1天,有一个苗增高导致不完美,那么我们可以用减一的办法让它恢复
这样x后面的天都可以变成腕足条件的
所以二分天数是可以的
(这个应该是最短的正常c++代码)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll n,l,r,mid,a[N],b[N];
bool ok(ll x){
for(int i=1;i<=n;i++){
b[i]=a[i]+x/n+(x%n>=i);
}
sort(b+1,b+1+n);
ll res=0;
for(int i=1;i<=n;i++) res+=abs(b[i]-b[(n+1)/2]);
return res<=x;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
l=1, r=1e14;
while(l<=r){
mid=(l+r)/2;
if(ok(mid)) r=mid-1;
else l=mid+1;
}
cout<<l;
return 0;
} 创作不易点个赞呗
京公网安备 11010502036488号