题解:因为一共就三段,每段要求是2的整数次幂,所以直接枚举前两段的长度,然后暴力答案就行了。
AC代码:
#include <bits/stdc++.h>
//#define int long long
#define x first
#define y second
using namespace std;
const int N=1e6+5;
typedef pair<int,int> PII;
int n;
int mp[N];
int work(int w1,int w2){
int i=1,res=0,sum=0;
for(;i<=n;i++){
if(sum+mp[i]>w1)break;
sum+=mp[i];
}
res+=w1-sum;
sum=0;
for(;i<=n;i++){
if(sum+mp[i]>w2)break;
sum+=mp[i];
}
res+=w2-sum;
int w3=1;
sum=0;
for(;i<=n;i++)sum+=mp[i];
while(w3<sum)w3<<=1;
res+=w3-sum;
return res;
}
void solve(){
//mp.clear();
cin>>n;
for(int i=0;i<=n;i++)mp[i]=0;
for(int i=0;i<n;i++){
int x;
cin>>x;
mp[x]++;
}
int res=1e9;
for(int i=0;(1<<i)<=n;i++)
for(int j=0;(1<<j)<=n;j++)
res=min(res,work(1<<i,1<<j));
cout<<res<<endl;
}
main(){
int T;
cin>>T;
while(T--)solve();
}