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;
}

posted @ 2024-02-22 19:10  hh20080501hh  阅读(11)  评论(0)    收藏  举报