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)
原文:https://www.cnblogs.com/RRRR-wys/p/9086143.html