时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大。其中AND是按位与操作。
小Ho当然知道怎么做。现在他想把这个问题交给你。
输入
第一行一个数T,表示数据组数。(1 <= T <= 10)
对于每一组数据:
第一行一个整数N(1<=N<=100,000)
第二行N个整数A1, A2, A3, ... AN (0 <= Ai <220)
输出
一个数表示答案
样例输入
2 3 1 2 3 4 1 2 4 5
样例输出
12 80
取每组输入的最大的四个数计算结果比较一下即可
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int T;
cin >> T;
int N;
while (T--)
{
long long s1 = 0, s2 = 0, s3 = 0, s4 = 0, t;
cin >> N;
while (N--)
{
cin >> t;
if (t > s1)
{
if (t > s2)
{
if (t > s3)
{
if (t > s4)
{
s1 = s2;
s2 = s3;
s3 = s4;
s4 = t;
}
else
{
s1 = s2;
s2 = s3;
s3 = t;
}
}
else
{
s1 = s2;
s2 = t;
}
}
else
{
s1 = t;
}
}
}
long long ans = 0, tans = 0;
long long ss[4] = { s1,s2,s3,s4 };
for (int i = 0; i < 4; i++)
{
for (int j = i + 1; j < 4; j++)
{
tans = ss[i] * ss[j] * (ss[i] & ss[j]);
if (tans > ans)
ans = tans;
}
}
cout << ans << endl;
}
return 0;
}