CF1931B Make Equal 题解
题意
分析
有 \(n\) 桶水,只能前面往后面倒水,并且要求水量相等。看到水量相等,我们很容易想到求平均数。于是我们开始思考怎么判断无解。
- 水总量不能被 \(n\) 整除时,这个时候会有多余的水,显然无解。
- 因为后面的桶不能往前面的桶里面倒水,所以前面的桶的水不够到平均数的时候就是无解。不过每个桶都有可能从前面的桶继承多余的水,我们需要考虑这一点。
代码
分析完之后,代码很容易写出了。
注意一下,因为 \(\sum n\le2\times10^5\) 并且 \(0\le a_i\le10^9\),所以在只有一组数据的时候,我们多余的水可能会爆 int 所以我们用 long long 来存
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+10;
int T;
int n;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> T;
while (T--)
{
cin >> n;
ll sum = 0;
for (int i=0 ; i<n ; i++)
{
cin >> a[i];
sum += (ll)a[i];
}
ll mod = sum%n;
if (mod)
{
cout << "NO\n";
continue;
}
ll mean = sum/n , have = 0;
bool flag = 0;
for (int i=0 ; i<n ; i++)
{
if (a[i]+have<mean)
{
cout << "NO\n";
flag = 1;
break;
}
if (a[i]>=mean)
{
have += a[i]-mean;
}
else
{
have -= mean-a[i];
}
}
if (!flag)
{
cout << "YES\n";
}
}
return 0;
}

浙公网安备 33010602011771号