题目链接
题意:
有一堆二进制数(01串,按字典序排序),从0到2m-1 ,我们删除其中n(n<=100)个数,再输出这些数的中位数。
思路:
因为是去除n个字符串,所以k只能向右移动。这里只需要对n个字符串转换为十进制从小到大进行排序,然后如果有a[i]≤k,k就++,最后将k转换为十进制输出。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=1e5+5;
const int inf=0x3f3f3f3f;
int n,m;
int check(string c)
{
int num=0,sum=1;
for(int i=m-1;i>=0;i--)
{
int a=c[i]-'0';
num+=sum*a;
sum*=2;
}
return num;
}
signed main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
int k=((1LL<<m)-n-1)/2,arr[N];
for(int i=0;i<n;i++)
{
string s;
cin>>s;
arr[i]=check(s);
}
sort(arr,arr+n);
for(int i=0;i<n;i++)
{
if(arr[i]<=k)
k++;
}
int ans[N];
for(int i=0;i<m;i++)
{
ans[i]=k%2,k/=2;
}
for(int i=m-1;i>=0;i--)
{
cout<<ans[i];
}
cout<<endl;
}
return 0;
}