题意:
总共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]