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(""); }
原文地址:https://www.cnblogs.com/RRRR-wys/p/9086143.html
时间: 2024-11-09 14:04:46