admin管理员组文章数量:1622629
题目大意:给你n(n<=1e5)个二进制串 (每个串位数不超过20),定义两个串的相似度为对应
位置上相同的个数。 让你构造一个二进制串,使这个串与所给的这些串的相似度的最小值最大。
思路:刚开始没什么思路。。。。后来被提示用bfs写,然后我想开一个1<<20 的vis[ i ],
vis[ i ]表示 i 这个串被访问过的最小步数,然后每个串跑一边bfs,这样就能找出最小步数中
的最大值,可是复杂度不允许。。。。。 后来看了别人写的,原来只要跑一边bfs就行了,我
好弱智啊,我们把所有串先压进队列,第一次访问到的肯定是最小值,之后就不用访问了,
然后找最大值就好了。。。
#include<bits/stdc++.h> using namespace std; const int N=1e5+5; int n,k,vis[1<<20],ans,mx; queue<int> Q; int main() { memset(vis,-1,sizeof(vis)); scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { int cur=0; for(int j=0;j<k;j++) { int g; scanf("%1d",&g); cur+=g<<j; } Q.push(cur); vis[cur]=0; } while(!Q.empty()) { int cur=Q.front(); Q.pop(); for(int i=0;i<k;i++) { int nx=cur^(1<<i); if(vis[nx]!=-1) continue; Q.push(nx); vis[nx]=vis[cur]+1; if(mx<vis[nx]) { mx=vis[nx]; ans=nx; } } } for(int i=0;i<k;i++,ans/=2) printf("%d",ans%2); puts(""); return 0; }View Code
转载于:https://wwwblogs/CJLHY/p/7677934.html
本文标签: ProgrammingContestNordicCollegiateNCPC
版权声明:本文标题:Nordic Collegiate Programming Contest NCPC 2017-Problem D-Distinctive Character 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728870479a1177218.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论