牛客练习赛108—惊鸿

链接:https://ac.nowcoder.com/acm/contest/51208/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述
云浅有四个正整数 a1,a2,a3,a4.
她可以进行任意次操作,每次操作中,她可以选出某两个数ai,aj,,然后将 ai变为 ai or aj
其中 or 是位或运算。
她想要最大化 a1+a2+a3+a4的值。你需要帮她求出这个最大值。

在这里插入图片描述

输出描述:
对于每组数据,输出一行一个非负整数表示 a1+a2+a3+a4的最大值.

实例输入

2
1 1 4 5
1 2 3 4

输出

20
28

思路:对a1,a2,a3,a4四个数进行任意次的位或运算,任意次说明进行或运算操作的次数可以根据需要调整,先来回顾一下什么是位或运算吧。当我们把十进制数转换为二进制数后,再按位对二进制数的每一位位进行或运算,我们会发现无论多少个数,只要某个数的某一位为1,其他任意数与该数做或运算的结果所对应的位置也为1。为了让a1+a2+a3+a4的值最大,也就是说要让a1,a2,a3,a4四个数经过任意次操作后都变为一个存在最多1的二进制数。
在这里插入图片描述
写得有点绕,看不懂可以直接上代码,最大值就是(a1 or a2 or a3 or a4)*4; 好久不写代码,脑子都快生锈了 ,写结构体或者二维数组都是可以的。

#include<iostream>
#include<cmath>
using namespace std;
struct A {
    
    
	int a1, a2, a3, a4=0;
};
const int T = 1e4;
A arr[T];
int Turnre(A test)
{
    
    
	int sum=test.a1 | test.a2 | test.a3 | test.a4;
	return sum;
}
int main()
{
    
    
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
    
    
		cin >> arr[i].a1 >> arr[i].a2 >> arr[i].a3 >> arr[i].a4;
		cout << Turnre(arr[i]) * 4 << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_52049271/article/details/129562934