ARC146 B. Plus and AND
Difficulty:1335
問題
解法
上位bitから見て行って、そのbitを立たせることができるなら必ず立たせた方が良い(下位bitを合計してもそのbitに勝てないので)
ので、貪欲で良い。
実装
code:cpp
bool solve(){
LL(n,m,k);
vector<ll>a(n);cin >> a;
ll ans{};
for(int i = 31;i>=0;i--){
ans += 1ll<<i;
pqg<ll>pq;
rep(ind,n){
bool ok = false;
ll l{},r{};
for(int j = 31;j>=0;j--){
if(bit(ans,j)&&!bit(aind,j)){ ok = true;
}
if(ok){
l += (bit(ans,j))<<j;
}
}
pq.push(l-r);
}
ll cn{};
rep(j,k){
cn += pq.top();
pq.pop();
}
deb(i,cn);
if(cn>m)ans-=1ll<<i;
}
O(ans);
return false;
}