华中农业大学第六届程序设计大赛网络同步赛 H.hzk又双叒叕在打人(伪暴力/bitset)

这题用bitset
来写比较方便,稍微快一点点。
我们将问题转化为找最小的最大,
那么这题只要枚举和给你的数的距离为k−1
的数就行,后面找到的数对应的也可以得到,需要注意的是(1<<20)
的大小,大概是比1.05e6小一点。
#include<cstdio> #include<iomanip> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #include<vector> #include<set> #include<queue> #include<limits.h> #include<string.h> #include<map> #include<list> #include<bits/stdc++.h> using namespace std; typedef long long ll; #define inf int(0x3f3f3f3f) #define mod int(1e9+7) #define eps double(1e-6) #define pi acos(-1.0) #define lson root << 1 #define rson root << 1 | 1 int vis[1050000]; bitset<20> num; queue<int> q; queue<int> Q; void init() { memset(vis,0,sizeof(vis)); } int n,k; int main() { // cout<<(1<<20)<<endl; ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T; cin>>T; for(int t=0;t<T;t++) { init(); int Max=0; int Min=INT_MAX; cin>>n>>k; for(int i=0;i<n;i++) { cin>>num; int nn=num.to_ulong(); if(!vis[nn]) { vis[nn]=1; q.push(nn); Q.push(0); } } // cout<<111<<endl; while(!q.empty()) { int num=q.front(); q.pop(); Min=Q.front(); Q.pop(); Max=max(Max,Min); for(int i=0;i<k;i++) { if(!vis[num^(1<<i)]) { vis[num^(1<<i)]=1; q.push(num^(1<<i)); Q.push(Min+1); } } } Max=k-Max; cout<<Max<<endl; } }
发表评论