码迷,mamicode.com
首页 > 其他好文 > 详细

SGU 207.Robbers

时间:2015-03-07 13:50:15      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

题意:

  有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

 

SGU 207.Robbers

标签:

原文地址:http://www.cnblogs.com/keam37/p/4319979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!