ニウケ練習試合 108—景紅

リンク: 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;
}

おすすめ

転載: blog.csdn.net/weixin_52049271/article/details/129562934