思路:用unordered_map模拟,在map里面找到mp的最大值Max和最小值Min;
1.当k足够大的时候的平衡情况是Max-Min=0 || Max-Min=1,ans=Max-Min(如样例2,第水池2的水可以抽一升再放回去)
2.当Max-Min为其他(即k=0),ans=Max-Min
所以终止条件k=0或Max-Min=0 || Max-Min=1,模拟即可
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
typedef long long ll;
using namespace std;
const int inf=0x3f3f3f3f;
unordered_map<int, int > mp;
int main()
{
int n,k;
while(scanf("%d%d", &n, &k)!=EOF)
{
mp.clear();
int l=inf, r=0, x;
for(int i=0; i<n; i++)
{
scanf("%d", &x);
mp[x]++;
l=min(l, x);
r=max(r, x);
}
while(k>0)
{
int temp=min(min(mp[l],mp[r]),k);
mp[l]-=temp;
mp[r]-=temp;
mp[l+1]+=temp;
mp[r-1]+=temp;
k-=temp;
if(mp[l]==0) l+=1;
if(mp[r]==0) r-=1;
if(r-l==0 || r-l==1) break;
}
printf("%d\n", r-l);
}
return 0;
}