[CF1365E] Maximum Subsequence Value - 贪心
Description
给出一个长度为 (n) 的数列 (a),你需要选出一个子序列,使其价值最大,输出最大的价值。对于一个长度为 (k) 的子序列,若在这个子序列中有不少于 (max(1,k-2)) 个数的二进制位 (i) 上是 (1),则其价值增加 (2^i)。
Solution
考虑当 (k le 3) 时,选择所有的数一定最优。
当 (k > 3) 时,由于选择的数每增加一个,每一位要产生贡献要求的数的个数也会增加一个,这样无论如何都不会变得更优,因此我们只需要枚举选择三个数即可。
换言之,简单地说,当且仅当 (k le 3) 时我们是在做或运算。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e+6 + 5;
const int M = 1e+3 + 5;
const int mod1 = 1e+9 + 7;
const int mod2 = 998244353;
#define dbg(x) cerr << #x << ":" << x << endl
void solve()
{
int n;
cin >> n;
vector<int> a(n + 2);
for (int i = 1; i <= n; i++)
cin >> a[i];
if (n <= 3)
{
int ans = 0;
for (auto i : a)
ans |= i;
cout << ans << endl;
}
else
{
int ans = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
for (int k = 1; k <= n; k++)
{
int tmp = a[i] | a[j] | a[k];
ans = max(ans, tmp);
}
}
}
cout << ans << endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
int t;
t = 1;
while (t--)
{
solve();
}
return 0;
}