51nod 1110 距离之和最小 V3

来源:互联网 发布:java截取汉字字符串 编辑:程序博客网 时间:2024/06/05 17:04

把权值为x的一个点,当成x个权值为1的点。

#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 10010;struct Point{    LL x,val;    bool operator < (const Point& b) const    {        return x < b.x;    }};Point ps[MAXN];int main(){    LL n;    LL all = 0;    scanf("%lld",&n);    for(LL i = 0; i < n; ++i)    {        scanf("%lld %lld",&ps[i].x,&ps[i].val);        all += ps[i].val;    }    sort(ps,ps+n);    LL mint;    LL sindex = 0,eindex = n-1,cnt = 0,res = 0;    all /= 2;    while(cnt < all && sindex <= eindex)    {        mint = min(ps[sindex].val,ps[eindex].val);        cnt += mint;        res += mint*(ps[eindex].x-ps[sindex].x);        ps[sindex].val -= mint;        ps[eindex].val -= mint;        if(ps[sindex].val == 0)            ++sindex;        if(ps[eindex].val == 0)            --eindex;    }    printf("%lld\n",res);    return 0;}
原创粉丝点击