题解:P14047 [SDCPC 2019] Stones in the Bucket
思路
如果我们设一个数
令
同理,定义
我们发现这两种操作:
-
操作一:我们可以从任意一个桶拿出一个石头,不难发现这个操作只在
a_i>x 的桶使用是有意义的。操作后会将right\leftarrow right-1 。 -
操作二:我们可以从一个桶中拿出一个石头,放到另一个桶。不难发现,这个操作拿出石头的一个桶应满足
a_i>x ,放石头的那个桶应该是a_i<x 的。这样最优。不难发现这个操作会让right\leftarrow right-1,left\leftarrow left-1 。
最后需要的操作次数就是
那么说了这些,最后一个问题就是 x怎么选择?显然可以使用二分(应该是
所以我们可以
代码
时间复杂度
#include <bits/stdc++.h>
using namespace std;
#define int long long
void mian()
{
int n;
cin >> n;
int a[114514], sum = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
sum += a[i];
}
sum = sum / n;
int right = 0;
for (int i = 1; i <= n; i ++)
{
if (a[i] > sum) right += a[i] - sum;
}
cout << right << endl;
}
signed main()
{
int T;
cin >> T;
for (int i = 1; i <= T; i ++) mian();
return 0;
}