#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[101];
int main(){
int n;
cin>>n;
ll res=0;
priority_queue<ll>q;
for(int i=1;i<=n;i++) {
cin>>a[i];
q.push(a[i]);
}
for(int i=35;i>=0;i--){
ll c=q.top();
if((1ll<<i)<=c){
if((1ll<<i+1)<=c) {
res+=(1<<i+1)-1;
break;
}
res+=1<<i;
q.pop();
c-=1ll<<i;
q.push(c);
}
}
cout<<res;
return 0;
}
维护一个大根堆
性质:如果当前位不是当前数的最高位,说明其他当前位和低位均可取1 否则取到当前位,然后把去除之后的数压入队列