D1. Candy Party (Easy Version) Codeforces Round 896 (Div. 2)

Problem - D1 - Codeforces

题目大意:有一个n个数的数组a,要求令每一个数减去一个任意数,然后任选一个数加上,问能否使所有数相等

1<=n<=2e5

思路:因为要让每个数相等,首先检查他们的和能否平分成n份,不能平分肯定不行。

然后求出所有数与平均值的差x,目标就是让x都变成0,对于任意一个二进制数例如01110110,我们如果要让某一段连续的1变成0,例如我们要让从右往左第4到第8位变成0,就要-(),也就是-

所以在只能减去一个2的幂再加上一个2的幂的情况下,只能去除x的二进制表达里面一段连续的1,所以如果某个x里面有多段1,则无法使所有相等,否则我们对于每个x,找到它最高位再高一位对应的数y,和其最低位的数z,那么如果x>0,其应该给出一个y,并获得一个z,如果x<0,其应该给出一个z,获得一个y,这样就能确保每个数在给出一个数时,给出的数都是<=它自己的,用两个map分别存储需要和给出的数字数量,检验是否匹配即可

cpp 复制代码
#include<bits/stdc++.h>
//#include<__msvc_all_public_headers.hpp>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int n;
ll a[N];
ll b[N];
ll m2[50];
ll lowbit(ll x)
{
	return x & (-x);
}
void init()
{

}
void solve()
{
	cin >> n;
	ll sum = 0;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		sum += a[i];
	}
	if (sum % n != 0)
	{//没法平分肯定不行
		cout << "No" << endl;
		return;
	}
	ll ave = sum / n;
	map<ll, int>give, gain;
	for (int i = 1; i <= n; i++)
	{
		b[i] = a[i] - ave;
		if (!b[i])//和平均数相等的直接放在任意两个数中间即可
			continue;
		ll x = abs(b[i]);
		int it = upper_bound(m2, m2 + 31, x) - m2;//找到最高位的跟高一位
		ll y = lowbit(x);//找到最低位
		if (!(x + y == m2[it]||x==y))
		{//是否只有一段连续的1
			cout << "No" << endl;
			return;
		}
		ll z = m2[it];
		if (b[i] < 0)
		{//比平均值大的给大的,比平均值小的给小的
			gain[z]++;
			give[y]++;
		}
		else
		{			
			give[z]++;
			gain[y]++;
		}		   
	}
	for (map<ll, int>::iterator it = give.begin(); it != give.end(); it++)
	{//遍历所有需求的数
		ll x = it->first;
		int num = it->second;
		gain[x] -= num;//对应减少提供的数字数量
		if (gain[x] != 0)
		{//给的多了少了都不行
			cout << "No" << endl;
			return;
		}
	}
	cout << "Yes" << endl;
}
int main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(false);
	int t;
	for (int i = 0; i <= 30; i++)
	{//预处理2的幂的数组
		m2[i] = 1 << i;
	}
	cin >> t;
	while (t--)
	{
		solve();
	}
	return 0;
}
相关推荐
Bucai_不才18 分钟前
【C++】初识C++之C语言加入光荣的进化(上)
c语言·c++·面向对象
木向20 分钟前
leetcode22:括号问题
开发语言·c++·leetcode
筑基.27 分钟前
basic_ios及其衍生库(附 GCC libstdc++源代码)
开发语言·c++
蹉跎x33 分钟前
力扣1358. 包含所有三种字符的子字符串数目
数据结构·算法·leetcode·职场和发展
yuyanjingtao40 分钟前
CCF-GESP 等级考试 2023年12月认证C++三级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
坊钰1 小时前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
巫师不要去魔法部乱说2 小时前
PyCharm专项训练4 最小生成树算法
算法·pycharm
IT猿手2 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
阿七想学习2 小时前
数据结构《排序》
java·数据结构·学习·算法·排序算法
王老师青少年编程2 小时前
gesp(二级)(12)洛谷:B3955:[GESP202403 二级] 小杨的日字矩阵
c++·算法·矩阵·gesp·csp·信奥赛