zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    工具类官网Web原型制作分享-Adobe
    还在为黑白网页设计犯难?12款设计帮你轻松解决!!!
    联系我们吧
    单调栈&&单调队列
    *模板--数据结构
    非递归线段树专题
    反素数
    线段树专题训练
    BST
    排列与组合
  • 原文地址:https://www.cnblogs.com/keam37/p/4319979.html
Copyright © 2011-2022 走看看