SGU 207.Robbers

题意:

  有m(m<=10^4)个金币分给n(n<=1000)个人,第i个人期望得到所有金币的xi/y,现在给分给每个人一些金币ki使得∑|xi/y-ki/m|最小。

 

Solution:

  首先要算出所有人的期望金币,向下取整.如此一来,所有人期望金币的和s一定小于等于m.这个时候我们需要将剩下的m-s个金币分给m-s个人,对于xi/y-ki/m,将其乘上y*m 得到 xi*m-ki*y,n个人中这个值最大的m-s个人就是我们需要分的人.

 

 

#include <iostream>
#include <queue>
#include <cmath>
using namespace std;
struct node {
    int p, val;
    bool operator < (const node &a) const {
        return a.val > val;
    }
} tem;
priority_queue<node> ql;
int ans[1009];
int n, m, y, s;
int main() {
    ios::sync_with_stdio (0);
    cin >> n >> m >> y;
    for (int i = 0, x; i < n; i++) {
        cin >> x;
        ans[i] = m * x / y;
        s += ans[i];
        tem.p = i;
        tem.val = abs (x * m - ans[i] * y);
        ql.push (tem);
    }
    s = m - s;
    while (s--) {
        tem = ql.top(); ql.pop();
        ans[tem.p]++;
    }
    for (int i = 0; i < n; i++)
        cout << ans[i] << ' ';
}
Code

 

转载于:https://www.cnblogs.com/keam37/p/4319979.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值