題目鏈接
題意:
有一堆二進制數(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;
}