リンク: https://ac.nowcoder.com/acm/contest/51208/A
出典: Niuke.com
制限時間: C/C++ の場合は 1 秒、その他の言語の場合は 2 秒
容量制限: C/C++ の場合は 262144K、その他の言語の場合は 524288K
64 ビット IO 形式: %lld
問題の説明
Yun Qian には 4 つの正の整数 a1、a2、a3、a4 があります。
彼女は任意の数の演算を実行できます。各演算で、彼女は 2 つの数値 ai、aj を選択し、ai を ai または aj に変更できます。ここで、または は
aビット単位の OR 演算。
彼女は、a1+a2+a3+a4 の値を最大化したいと考えています。あなたは彼女がこの最大値を見つけるのを手伝う必要があります。
出力の説明:
データのセットごとに、a1+a2+a3+a4 の最大値を表す負でない整数を 1 行に出力します。
入力例
2
1 1 4 5
1 2 3 4
出力
20
28
アイデア: 4 つの数値 a1、a2、a3、および a4 に対して任意の回数のビット単位の OR 演算を実行します。任意の回数とは、必要に応じて OR 演算の回数を調整できることを意味します。まず、ビット単位の OR 演算とは何かを確認しましょう。10 進数を 2 進数に変換し、2 進数の各ビットに対して OR 演算を実行すると、数値の数に関係なく、数値の特定のビットが 1 である限り、任意の数値が得られることがわかります。他の数値はその数値と等しく、OR 演算の結果に対応する位置も 1 になります。a1+a2+a3+a4 の値を最大化するには、つまり 4 つの数値 a1、a2、a3、a4 を任意の回数の演算後に最大 1 の 2 進数に変換する必要があります。
少し複雑な書き方です。理解できない場合は、直接コーディングできます。最大値は (a1 または a2 または a3 または a4)*4 です。長い間コードを書いていなかったので、脳はほとんど錆び付いています。構造体または 2 次元配列を書くことができます。
#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;
}