【TUST“码蹄杯”编程之星】4.27号每日一题-23101206李迪菲

题目:

你被给定一个大小为n的数组a。

你可以对该数组执行以下操作:

选择两个不同的整数i,j(1≤i | aj = x | y,其中 | 表示按位或运算。注意x和y是非负整数。
请输出在使用上述操作任意次数后,数组元素可能的最小总和。

输入

第一行包含一个整数n(2≤n≤100)——数组a的大小。

第二行包含n个整数a1,a2,…,an(0≤ai<2^30)。

输出
每个测试用例输出一行一个数字——数组可能的最小总和。

输入数据:

14

571222016 671296024 538780184 43909120 34540040 168034840 143008256 926208 34545664 680010264 578887680 33696264 546048000 671221760

思路:

题目意思是给你n个数字,让你按照aj | ai = x | y去替换里面的数字最后整体的和最小.

例如6 和 6这两个数字按位与后还是6 那么我就可以替换为6和0(因为6和0的按位与也是6),那么这样的话6 + 0 的值是最小的,

那么思路就很简单了,我们只需要一直按位与下去,把按位与的结果输出即可.

以下是代码:

#include

using namespace std;
#define ll long long
#define MOD 

int main()
{      
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n;
	cin>>n;
	vectorvec(n);
	for(int i = 0;i < n;i ++)
	{
		cin>>vec[i];
	}
	ll ans = 0;
	for(int i = 0;i < n;i++)
	{
		ans |= vec[i];
	}
	cout<

你可能感兴趣的:(算法)