0
点赞
收藏
分享

微信扫一扫

D. Martial Arts Tournament(暴力)


题解:因为一共就三段,每段要求是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();
}


举报

相关推荐

0 条评论