链接: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;
}