cf 672d Robin Hood 【二分】

该博客介绍了如何使用二分查找策略解决CF672D问题,其中涉及n个人的金币分配和k次操作,操作目的是缩小最富有与最贫穷者之间的金币差距。通过找到每次操作后金币最大值和最小值的变化范围,进行二分验证从而求解。
摘要由CSDN通过智能技术生成



点击打开链接


题意:


             总共n个人,每个人有ci个金币,拥有k次操作,每次操作可以把金币最多的人减少一个金币,金币最少的一个人增加一个金币。

             问k次操作后最后所有人中金币最多的人币金币最少的人多多少金币。


题解:

    

   已知n5e5.k 1e9 ,模拟肯定gg。

           二分答案验证,check又不好写,当时有点懵逼。

           后来想到每次操作要做的就是把金币的最大值尽可能降低,金币的最小值尽可能升高,

          那我们只要找到这两个值即可,二分这两个值,验证即可。就ac了。


#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=5e5+10;
int n,k;
int num[maxn];
bool check1(int x){
    ll ret=0;
    for(int i=1;i<=n;++i)
        if(num[i]<x)
            ret+=x-num[i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值