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 }

原文地址:https://www.cnblogs.com/zhangchaosd/p/10865473.html

时间: 2024-10-09 19:07:45

hihoCoder 第254周 hiho一下 寻找最大值的相关文章

hihoCoder 第253周 hiho一下 矩形分割

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一块由NxM个单位正方形组成的矩形.现在小Ho在某些单位正方形上画了一道分割线,这条分割线或者是单位正方形的主对角线(用'\'表示),或者是副对角线(用'/'表示). 现在小Hi想知道这些分割线把NxM的矩形分割成了多少块区域. 例如 /\/ 就把2x2的矩形分成了5个区域. /\/\ / \/ 把3x4的矩形分成了7个区域. 输入 第一包含两个整数N和M.(1 <= N, M <= 100) 以下N行每行包

hihoCoder 第255周 hiho一下 Queen Attack

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There are N queens in an infinite chessboard. We say two queens may attack each other if they are in the same vertical line, horizontal line or diagonal line even if there are other queens sitting between them.

hihocoder第七周 完全背包模板题

时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说之前的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励的时刻了! 等等,这段故事为何似曾相识?这就要从平行宇宙理论说起了………总而言之,在另一个宇宙中,小Ho面临的问题发生了细微的变化! 小Ho现在手上有M张奖券,而奖品区有N种奖品,分别标号为1到N,其中第i种奖品需要need(i)张奖券进行兑换,并且可以兑换无数次,为了使得辛苦得到的奖券不白白浪费,小Ho给每件奖品都评了分,其

同时寻找最大值和第二大值 锦标赛算法

问题:在一个数组中同时寻找最大值和第二大值,这里假设数组的元素个数n大于2 方法一:遍历数组,设置max和secondMax标志,如果有大于max的就更新max,如果有小于max但是大于secondMax的就更新secondMax. 比较次数:在a[0]和a[1]中找出临时的max和secondMax需要一次比较.在剩下的n-2个数中最坏时需要同max和secondMax分别比较,总共比较2(n-2),所以总的比较次数为1+2(n-2).代码如下: void traverse_find(int

hihocoder 1330 - 数组重排 - [hiho一下167周][最小公倍数]

题目链接:https://hihocoder.com/problemset/problem/1330 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi想知道,如果他每次都按照一种固定的顺序重排数组,那么最少经过几次重排之后数组会恢复初始的顺序? 具体来讲,给定一个1 - N 的排列 P,小Hi每次重排都是把第 i 个元素放到第 Pi个位置上.例如对于 P = (2, 3, 1),假设初始数组是(1, 2, 3),重排一次之后变为(3, 1, 2),重排两次之后

hihocoder 1496:寻找最大值(高维前缀最大次大值)

[题目链接] https://hihocoder.com/problemset/problem/1496 [题目大意] 给定N个数A1, A2, A3, ... AN, 从中找到两个数Ai和Aj(i≠j)使得乘积Ai*Aj*(Ai&Aj)最大 [题解] 我们可以枚举x&y的结果z,找出两个数x&y==z使得x*y最大,更新答案即可, 条件可以被削弱为z为x&y的子集,这种条件放缩不会导致最优解的丢失, z为x&y的子集等价于z为x的子集并且z为y的子集. 那么我们只

hihocoder 1331 - 扩展二进制数 - [hiho一下168周]

题目链接:http://hihocoder.com/problemset/problem/1331 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 我们都知道二进制数的每一位可以是0或1.有一天小Hi突发奇想:如果允许使用数字2会发生什么事情?小Hi称其为扩展二进制数,例如(21)ii = 2 * 21 + 1 = 5, (112)ii = 1 * 22 + 1 * 21 + 2 = 8. 很快小Hi意识到在扩展二进制中,每个数的表示方法不是唯一的.例如8还可以有(

hihocoder 1496 寻找最大值

题解: 注意到$ai$只有$1e6$这件事情肯定要枚举和这个有关的东西 考虑枚举$ai&aj$的值就可以了 那么这个集合一定是ai,aj的子集 于是我们对每个集合从大到小枚举丢掉一位转移就行了 这实际上放缩了条件但显然最大值不变 这题并不用用到高维前缀和..但第一次听说于是学习了一下 原文地址:https://www.cnblogs.com/yinwuxiao/p/10107437.html

hihocoder 1320 - 压缩字符串 - [hiho一下160周]

这道题目可以说是一道非常好非常一颗赛艇的DP题了. 需要注意的是,其中情形3),字符串必然能完全转化为 N(str)形式,如果有N(str1)M(str2)等等另外样式,应该首先使用拼接形式对其进行划分. 那么,我们首先考虑写一个用来压缩情形3)下的字符串的函数zip(): 1 char str[105]; 2 int bit(int n) 3 { 4 int cnt=0; 5 while(n>0) 6 { 7 n/=10; 8 cnt++; 9 } 10 return cnt; 11 } 12