ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cf1607 G. Banquet Preparations 1(贪心)

2021-11-13 13:02:32  阅读:249  来源: 互联网

标签:mmax int sum smax Preparations mmin cf1607 白球 Banquet


https://codeforces.com/contest/1607/problem/G

题意:

给定数组a[],b[]和整数m。每个盘子里有ai个白球和bi个黑球。现要从每个盘子里拿走m个球,使得剩下的所有白球的和与所有黑球的和的差的绝对值最小。题目保证每个盘子里的球数不少于m

思路:

假设从每个盘子里拿 \(x_i\) 个白球和 \(m-x_i\)个白球,那么最后这个差的绝对值就是

\[\left| \sum_{i=1}^n (a_i-x_i) - \sum_{i=1}^n (b_i-(m-x_i)) \right| = \left| \sum_{i=1}^n (a_i-b_i+m-2x_i) \right| \\ = \left| nm+\sum_{i=1}^n (a_i-b_i) - 2\sum_{i=1}^n x_i \right| =|s - 2sumx| \]

每个 \(x_i\) 有最小值 \(mmin_i\) 和最大值 \(mmax_i\),所以 \(2sumx\) 也有最小值 \(2smin\) 和最大值 \(2smax\) 。而且 \(sumx\) 可以取到 \([smin, smax]\) 中的一切值!

如果 \(s >= 2smax\),答案就是 \(s-2smax\) ,每个盘子都要拿走 \(mmax_i\) 个白球;

如果 \(s <= 2smin\),答案就是 \(2smin-s\) ,每个盘子都要拿走 \(mmin_i\) 个白球;

如果 \(s\) 介于两者之间,那就先都拿 \(mmin_i\) 保底,然后贪心拿球逼近 \(s\) 。答案为0或1,取决于 \(s\) 的奇偶性

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const signed N = 2e5+10;
int mmax[N], mmin[N];

signed main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int T; cin >> T; while(T--)
    {
        int n, m; cin >> n >> m;
        ll s = (ll)m * n, smax=0, smin=0;
        for(int i = 1; i <= n; i++)
        {
            int a, b; cin >> a >> b;
            s += a - b;
            smin += mmin[i] = max(0, m - b);
            smax += mmax[i] = min(m, a);
        }
        if(s >= 2 * smax)
        {
            cout << s - 2 * smax << '\n';
            for(int i = 1; i <= n; i++)
                cout << mmax[i] << ' ' << m - mmax[i] << '\n';
        }
        else if(s <= 2 * smin)
        {
            cout << 2 * smin - s << '\n';
            for(int i = 1; i <= n; i++)
                cout << mmin[i] << ' ' << m - mmin[i] << '\n';
        }
        else
        {
            cout << s % 2 << '\n';
            for(int i = 1; i <= n; i++)
            {
                int tmp = min((ll)mmax[i] - mmin[i], (s - 2 * smin) / 2);
                smin += tmp;
                tmp += mmin[i];
                cout << tmp << ' ' << m - tmp << '\n';
            }
        }
    }

    return 0;
}

标签:mmax,int,sum,smax,Preparations,mmin,cf1607,白球,Banquet
来源: https://www.cnblogs.com/wushansinger/p/15547834.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有