当前位置: 代码迷 >> 综合 >> hihoCoder 第254周 hiho一下 寻找最大值
  详细解决方案

hihoCoder 第254周 hiho一下 寻找最大值

热度:31   发布时间:2024-01-06 15:45:34.0

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