一、题目

有n名选手在玩游戏,他们每个人有一个字符,每个字符都有自己固定的若干个特征。特征的种类数为k。每个人的特征为特征总集的一个子集。
两个字符的相似度定义为:如果两个字符A和B同时拥有某个特征或者同时没有某个特征,它们的相似度加一。
蒜头君想创造出一个字符,它与其它n名选手的字符的相似度分别为a1, a2, …, an,假设其中最大的相似度为ax,蒜头君希望ax尽量小。

输入格式

输入第一行包含两个整数n,k(1 <= n <= 105, 1 <= k <= 20)分别表示选手的个数以及特征的种类数。下面n行每行包含一个字符串表示某个选手的特征状态,如果在j位置有一个1表示他有第j个特征,否则没有。

输出格式

输出一个满足条件的字符串。
注:本题答案不唯一,符合要求的答案均正确

样例输入1

3 5
01001
11100
10111

样例输出1

00010

样例输入2

1 4
0000

样例输出2

1111

二、分析

(一)定义距离

本题考察相似度,反过来说就是考察不相似度。不相似度大,相似度就小;不相似度小,相似度就大。
可以用距离来衡量不相似度。若两个数有一位不一样,则不相似度为1,即距离为1。若两个数有两位不一样,则不相似度为2,即距离为2。若两个数有三位不一样,则不相似度为3,即距离为3。依此类推。

(二)求最大距离

题目要求最大的相似度最小,也就是求最小的距离最大。现在分析样例1,画出含3棵树的图如下所示:

 

与01001距离为1的结点有01000,01011,01101,00001,11001。换成十进制,即与9距离为1的结点为8,11,13,1,15。
与11100距离为1的结点有11101,11110,11000,10100,01100。换成十进制,即与28距离为1的结点为29,30,24,20,12。
与10111距离为1的结点有10110,10101,10011,11111,00111。换成十进制,即与23距离为1的结点为22,21,19,31,7。
与01000距离为1的节点有01001,01010,01100,00000,11000。换成十进制,即与8距离为1的节点为9,10,12,0,24。这里9即为第一层的节点。12和24与第一棵树的根节点28的距离为1。另两个节点10和 0,与第一层节点9的距离为2。
从图形里可以看出,节点10、节点0与第一层三个根节点的最小距离就是2。因为若把这两个节点放到28那棵树上,则这两个节点与根节点28的距离必然大于或等于2。同样若把这两个节点放到23那棵树上,则这两个节点与根节点23的距离必然大于或等于2。
把2k = 25 = 32个节点都挂到3棵树上后,可以发现节点2与根节点9的距离最大,为3。若把节点2挂到根节点为28的树上,则节点2与根节点28的距离必然大于或等于3(实际上很容易算出节点2与节点28的距离是4)。同样道理,若把节点2挂到根节点为23的树上,则节点2与根节点23的距离必然大于或等于3(实际上很容易算出节点2与节点23的距离是3)。
综上,三棵树上的最小深度(距离)为3,这就是所求的答案。

(三)广度优先搜索

这里需要用到广度优先搜索。广度优先搜索需要用到队列。在每个节点入队时,都要把距离为1的节点入队,入队即说明节点被遍历过。当然,已经遍历过的节点,就不需要再次入队了。在这里,可以根据一个节点的距离大小来判断节点是否已经遍历过。具体可以看实现代码。

三、代码

#include<bits/stdc++.h>
using namespace std; const int N = 21;
const int MAXN = 1e5 + 5;
int dist[1<<N], n, k;
char s[MAXN];
queue<int> q; void bfs()
{
while(q.size())
{
int u = q.front();
q.pop(); // 队首元素出队,接着要把相邻的5个元素入队
for(int i = 0; i < k; i++)
{
// if(i == 0)
// {
// printf("\n>>>>>>>>>>>>\ndist[%d] = %d\n", u, dist[u]);
// }
// printf("\n* dist[%d] = %d\n", u ^ (1<<i), dist[u ^ (1<<i)]);
if(dist[u ^ (1<<i)] > dist[u])
{
dist[u ^ (1<<i)] = dist[u] + 1; // 不相似度即距离加1
// printf("** dist[%d] = %d\n", u ^ (1<<i), dist[u ^ (1<<i)]);
q.push(u^(1<<i));
}
}
}
} // 十进制化为二进制再打印出来
void PRINT(int val)
{
for(int i = k - 1; i >= 0; i--)
{
printf("%d",(val & (1<<i)) > 0);
}
} int main()
{
freopen("test.in", "r", stdin);
memset(dist, 0x7f, sizeof(dist));
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++)
{
// 把几个原始的数据按顺序入队
scanf("%s", s);
int len = strlen(s), p = 0, sValue = 0;
for(int j = len-1; j >= 0; j--)
{
sValue += (1<<p) * (s[j]-'0');
p++;
}
q.push(sValue);
dist[sValue] = 0;
} bfs(); int maxDist = 0, ans = 0;
for(int i = 0; i < (1<<k); i++)
{
if(dist[i] > maxDist)
{
maxDist = dist[i];
ans = i;
}
} PRINT(ans); return 0;
}

祘头君的字符(DFS)的更多相关文章

  1. cctype头文件(字符处理库)的使用

    C++ 中cctype头文件的使用 头文件cctype(字符处理库)中定义了有关字符判断与处理的库函数,使用前要包含头文件: #include <cctype> using namespa ...

  2. php fwrite写入文件bom头导致的乱码问题解决

    最近导出文件遇到fwrite导出乱码,而且中英文都乱码,很费解.折腾了一番之后终于找到问题所在了,mark下. UTF-8 BOM 又叫 UTF-8 签名,其实 UTF-8 的 BOM 对 UFT-8 ...

  3. python 带BOM头utf-8的响应解码

    接口响应编码格式为带BOM头utf-8.直接获取响应的text出现乱码. '''dinghanhua2018-11requests text与content,指定响应的encoding''' api ...

  4. D - Fox And Two Dots DFS

    Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on ...

  5. 在开发板上显示英文字符和汉字--tiny6410

    程序字符需要改成gb2312.否则无法正常显示中文字符. main.c代码: #include <sys/types.h> #include <sys/stat.h> #inc ...

  6. 【8.22校内测试】【数学】【并查集】【string】

    今天的t2t3能打出来80分的暴力都好满足啊QwQ.(%%%$idy$ 今天的签到题,做的时候一眼就看出性质叻qwq.大于11的所有数分解合数都可以用4.6.9表示,乱搞搞就可以了. #include ...

  7. samba Doc

    Samba-HOWTO-Collection中文翻译版(2.20) 2013年08月23日 ⁄ 综合 ⁄ 共 19460字 ⁄ 字号 小 中 大 ⁄ 评论关闭 Samba计划文档 (初稿) Samba ...

  8. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  9. knn-伪代码与实现过程

    knn特点 优点:精度高,对异常值不明感,无数据输入嘉定 缺点:计算复杂度高,空间复杂度高 适用范围:数值型和标称型 knn算法的伪代码 1.计算已知类别数据集中的点与当前之间的距离 2.按照距离递增 ...

随机推荐

  1. CentOS 7 下oracle 11G R2 ADG 搭建

    本文记录ADG搭建操作步骤,首先在虚拟机CentOS中安装并配置好oracle 11g R2(具体安装步骤在我的另一篇博客中),然后拷贝一份虚拟机,修改新虚拟机的主机名和ip配置,这时候主库和备库是一 ...

  2. PHP基础(9.27 第十三天)

    什么是PHP,为什么要学习PHP:  (1)php是嵌入html页面中的脚本语言   (2)目前最流行的网站开发语言  (3)在几乎所有平台中都可以运行  (4)很多企业都在使用PHP作为开发语言 P ...

  3. POJ 1408:Fishnet

    Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1921   Accepted: 1234 Descripti ...

  4. 51nod 1429:巧克力

    1429 巧克力 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 现在有两个块巧克力一块大小是   的,另外一块大 ...

  5. 51nod 1105:第K大的数

    1105 第K大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 数组A和数组B,里面都有n个整数.数组C共有n^2个整数,分别是A[0] * ...

  6. JS/JQUERY函数库

    1. 判断字符串是否为空 function isEmptyString(str) { return str == undefined || str == "" || str == ...

  7. Sequence Models Week 3 Trigger word detection

    Trigger Word Detection Welcome to the final programming assignment of this specialization! In this w ...

  8. 线上环境 分析java问题 常见命令

    在生产上进程需要分析jvm运行情况,今天分享几个自己常用的命令,持续更新,欢迎补充 1.jps jstack -l {pid} > jstack.log #查看线程快照信息 2.jps jmap ...

  9. UVA 12657/COJ 1329 HN第九届省赛 链表模拟

    因为最近学了Splay,刚看到这个题目总共四种操作,把某个数移到另一个数的左边 或者右边 交换两个数 翻转整个序列,马上想到用Splay,因为总点数和总操作数都为10^5,如果用Splay把操作优化到 ...

  10. 神经网络 参数计算--直接解析CKPT文件读取

    1.tensorflow的模型文件ckpt参数获取 import tensoflow as tf from tensorflow.python import pywrap_tensorflow mod ...