hihoCoder 第254周 hiho一下 寻找最大值
时间限制: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
取每组输入的最大的四个数计算结果比较一下即可
1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 int main() 7 { 8 int T; 9 cin >> T; 10 int N; 11 while (T--) 12 { 13 long long s1 = 0, s2 = 0, s3 = 0, s4 = 0, t; 14 cin >> N; 15 while (N--) 16 { 17 cin >> t; 18 if (t > s1) 19 { 20 if (t > s2) 21 { 22 if (t > s3) 23 { 24 if (t > s4) 25 { 26 s1 = s2; 27 s2 = s3; 28 s3 = s4; 29 s4 = t; 30 } 31 else 32 { 33 s1 = s2; 34 s2 = s3; 35 s3 = t; 36 } 37 } 38 else 39 { 40 s1 = s2; 41 s2 = t; 42 } 43 } 44 else 45 { 46 s1 = t; 47 } 48 } 49 } 50 long long ans = 0, tans = 0; 51 long long ss[4] = { s1,s2,s3,s4 }; 52 for (int i = 0; i < 4; i++) 53 { 54 for (int j = i + 1; j < 4; j++) 55 { 56 tans = ss[i] * ss[j] * (ss[i] & ss[j]); 57 if (tans > ans) 58 ans = tans; 59 } 60 } 61 cout << ans << endl; 62 } 63 return 0; 64 }