时间限制: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;
}