枚举 · 例11-带权中位数(板子)
枚举 · 例11-带权中位数
假设一个数轴上有很多个点 这些点上都有人 要把所有人移动到同一个点上 并且所移动的距离最短
结论:将有人的点按大小排序 再进行前缀和 刚好超过总人数一半的那个点(假设总人数为sum 那么累加的人数>= sum / 2 时 就满足条件)即为所求的移动距离最短点
同时 假设每个点上只有一个人 那么只需要先排序 再求出中位数 就可以求出最短距离(求的方法因题而异)
作者:ryuuko_
链接:https://www.nowcoder.com/discuss/722243780460503040?urlSource=home-api
来源:牛客网
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
signed main(){
int n; cin >> n;
for(int i = 1; i <= n; ++i){int x; cin >> x;}
long long sum = 0, cur = 0;
for(int i = 1; i <= n; ++i) {cin >> a[i]; sum += a[i];}
for(int i = 1; i <= n; ++i){
cur += a[i];
if(cur >= sum / 2) {cout << i << endl; return 0;}
}
return 0;
}

浙公网安备 33010602011771号