Skip to content

Commit 158aa00

Browse files
Create Or Plus Max.cpp
1 parent cd13114 commit 158aa00

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include <iostream>
2+
#include <vector>
3+
4+
using namespace std;
5+
6+
int is_bit_set(int n, int bit)
7+
{
8+
return ( ( n & (1 << bit) ) != 0 );
9+
}
10+
11+
void update(int n, int &largest, int &second_largest, vector <int> &A)
12+
{
13+
//cout << "Updating " << A[n] << "\n";
14+
if(n == largest || n == second_largest)
15+
{ //cout << "Return";
16+
return;
17+
}
18+
19+
if(largest == -1 || A[n] > A[largest])
20+
{
21+
second_largest = largest;
22+
largest = n;
23+
}
24+
else if(second_largest == -1 || A[n] >= A[second_largest])
25+
{
26+
second_largest = n;
27+
}
28+
29+
//cout << "Largest = " << A[largest] << " " << A[second_largest] << "\n";
30+
}
31+
32+
int main()
33+
{
34+
int no_of_elements;
35+
cin >> no_of_elements;
36+
37+
int max_mask = 1 << no_of_elements;
38+
vector <int> A(max_mask + 1);
39+
for(int i = 0; i < max_mask; i++)
40+
{
41+
cin >> A[i];
42+
}
43+
44+
vector <int> largest(max_mask, -1), second_largest(max_mask, -1), sum(max_mask);
45+
largest[0] = second_largest[0] = 0;
46+
for(int m = 1; m < max_mask; m++)
47+
{
48+
//cout << "At " << m << " ";
49+
update(0, largest[m], second_largest[m], A);
50+
update(m, largest[m], second_largest[m], A);
51+
52+
for(int bit = 0; bit < no_of_elements; bit++)
53+
{
54+
if(is_bit_set(m, bit))
55+
{
56+
int submask_without_this_bit = m^(1 << bit);
57+
//cout << " At old " << submask_without_this_bit << "\n";
58+
update(largest[submask_without_this_bit], largest[m], second_largest[m], A);
59+
update(second_largest[submask_without_this_bit], largest[m], second_largest[m], A);
60+
}
61+
}
62+
}
63+
64+
for(int m = 1; m < max_mask; m++)
65+
{
66+
sum[m] = max(sum[m - 1], A[largest[m]] + A[second_largest[m]]);
67+
}
68+
69+
for(int m = 1; m < max_mask; m++)
70+
{
71+
cout << sum[m] << "\n";
72+
}
73+
74+
return 0;
75+
}

0 commit comments

Comments
 (0)