H. Binary Median (貪心)

H. Binary Median (貪心)

傳送門

思路:因爲要找到去除nn個字符串後第k12\dfrac{k-1}{2}小的字符串。

考慮在不去除任何字符串的時候第k12\dfrac{k-1}{2}小的字符串轉爲十進制答案就是pos=k12pos=\dfrac{k-1}{2}

因爲是去除nn個字符串,所以pospos只能向右移動。

這裏只需要對nn個字符串轉換爲十進制從小到大進行排序,然後如果有a[i]pos,posa[i]\leq pos,pos就右移動一位。這裏從小到大排序是防止pospos移動到刪掉的字符串位置。ep:pos0=5,a1=6,a2=5ep: pos_0=5, a_1=6,a_2=5這裏pospos移動到6就停了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
#define mst(a) memset(a,0,sizeof a)
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		ll n,m,k;
		scanf("%lld%lld",&n,&m);
		k=(1LL<<m)-n-1,k/=2;
		ll a[105]={},ans[105]={};
		char b[65];
		for(int i=0;i<n;i++){
			scanf("%s",b);
			for(int j=0;j<m;j++)
			  a[i]=a[i]*2+b[j]-'0';
		}
		sort(a,a+n);
		for(int i=0;i<n;i++)
			if(a[i]<=k) k++;
		for(int i=0;i<m;i++)
			  ans[i]=k%2,k/=2;
		for(int i=m-1;i>=0;i--) printf("%d",ans[i]);
		puts(""); 
	}
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章