zoukankan      html  css  js  c++  java
  • Nordic Collegiate Programming Contest NCPC 2017-Problem D-Distinctive Character

    题目大意:给你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
  • 相关阅读:
    lambda表达式
    netstat
    【makfile | 资源】网址链接
    【makefile】 $@ $^ %< 的使用

    【顺序容器 || 09】
    标准IO库
    我使出这“三板斧”(分段锁、哈希锁、弱引用锁)灭霸跑了......
    JAVA 线上故障排查完整套路,从 CPU、磁盘、内存、网络、GC 一条龙!
    一条 SQL 引发的事故,同事直接被开除!
  • 原文地址:https://www.cnblogs.com/CJLHY/p/7677934.html
Copyright © 2011-2022 走看看