码迷,mamicode.com
首页 > 其他好文 > 详细

2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)

时间:2018-05-25 10:55:42      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:ogr   如何   mem   scan   def   eof   pac   fine   har   

D.Distinctive Character

看到样例,第一个反应贪心。先写了个按这一位1和0的数目多少,确定0还是1的东西。感觉不够真,又写了个尽量加到相似的比较小的串上的贪心。在和前边的那个组合一下,换了换顺序。。。好吧就过了13组样例。。。正解如下:考虑如何求出,所有2^k个状态与这n个串的最大相似度。起初的n个串的答案显然为k,那改变一个位置,相似度就改变为k-1,对于一个状态,越早算出来的相似度,越大,那么就可以直接bfs求出所有状态的最大相似度了。答案就是取最小值的状态。

#include <bits/stdc++.h>
#define mem(W) memset(W,0,sizeof(W))
using namespace std;
int n, k, a[1<<23], b[1<<23];
char s[25];
int q[1<<23],l=0,r=0;
int main(){
    scanf("%d%d",&n,&k);
    for(int i=0;i<(1<<k);++i)b[i]=-1;
    for(int i=1;i<=n;++i) {
        scanf(" %s",s);
        for(int j=0;j<k;++j) a[i]=a[i]*2+(s[j]-‘0‘);
        q[r]=a[i];++r;
        b[a[i]]=k;
    }
    while(l<r){
        int S=q[l]; ++l;
        for(int i=0;i<k;++i){
            if(b[S^(1<<i)]==-1){
                b[S^(1<<i)]=b[S]-1;
                q[r]=S^(1<<i); ++r;
            }
        }
    }
    int MN=10000,ans=0;
    for(int i=0;i<(1<<k);++i){
        if(MN>b[i]){
            MN=b[i];
            ans=i;
        }
    }
    for(int i=k-1;i>=0;--i)printf("%d",!!(ans&(1<<i)));puts("");
}

  

2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)

标签:ogr   如何   mem   scan   def   eof   pac   fine   har   

原文地址:https://www.cnblogs.com/RRRR-wys/p/9086143.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!