枚举 · 例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;
}
posted @ 2025-03-26 15:48  awei040519  阅读(35)  评论(2)    收藏  举报