万革始笔试第一题求指点

求问万革始笔试第一题的答案,暴力搜索正确率70%

大概描述是这样:

ID编号是一个K位的0/1字符串,定义两个ID间的距离是不一样的位的数目,例如 01000与10100距离是3.

现在已经有N个ID了,要找一个ID,使得它和已有ID间的最小距离最大,求字典序最小的ID

暴力搜索70%的方法如下,有什么别的思路么?求大佬指点~

#include <iostream>
#include <string>
#include <vector>
#include <cmath>

using namespace std;

int distance(string s1, string s2)
{
    int cnt = 0;
    for (int i = 0; i < s1.size(); ++i)
    {
        if (s1[i] != s2[i])
            cnt++;
    }
    return cnt;
}

int main()
{
    int n, k;
    cin >> n >> k;

    vector<string> s;
    for (int i = 0; i < n; ++i)
    {
        string x;
        cin >> x;
        s.push_back(x);

    }

    string res;
    int best = 0;

    for (int i = 0; i < pow(2,k); ++i)
    {
        string t;

        for (int j = 0; j < k; ++j)
        {
            if (i >> j & 0x1)
            {
                t = '1' + t;
            }
            else
                t = '0' + t;
        }

        int mini = INT_MAX;
        for (int j = 0; j < n; ++j)
        {
            int r = distance(t, s[j]);
            if ( r < mini )
            {
                mini = r;
            }
            if (r < best)
                break;
        }

        if (mini > best)
        {
            best = mini;
            res = t;
        }

    }
    cout << res << endl;
    return 0;
}
#万革始##笔试题目#
全部评论
汉明距离
点赞 回复 分享
发布于 2018-09-15 22:40
顶一顶,继续求大佬指点
点赞 回复 分享
发布于 2018-09-15 23:57
是超时了还是怎么回事
点赞 回复 分享
发布于 2018-09-16 00:11
同做法,同超时
点赞 回复 分享
发布于 2018-09-16 09:27
n和k的数据范围多大?
点赞 回复 分享
发布于 2018-09-16 09:54
第二题怎么做
点赞 回复 分享
发布于 2018-09-20 20:50
求会的大佬指点
点赞 回复 分享
发布于 2018-09-20 20:53
第二题答案,可能不是最终答案,但整体思路没动过 #include <iostream> #include <vector> #include <unordered_map> #include <cmath> #define LL long long using namespace std; int main() { int n; cin >> n; vector<unordered_map<int,int>> t(9, unordered_map<int,int>()); vector<int> nums; for (int i = 0; i < n; ++i) { LL x; cin >> x; nums.push_back(x); LL base = 10; for (int j = 0; j < 9; ++j) { t[j][int((LL)(x)*(LL)(base) % (LL)(7))]++; base *= 10; } } int cnt = 0; for (int i = 0; i < n; ++i) { int base = 0; int x = nums[i]; do { base++; x /= 10; } while (x > 0); int remain = (7 - nums[i] % 7) % 7; if (t[base-1][remain] >= 2) if (((LL)(nums[i]) * (LL)(pow(10, base))) % 7 == remain) { cnt += t[base - 1][remain] - 1; } else cnt += t[base - 1][remain]; else if (t[base-1][remain] < 1) continue; else { if (((LL)(nums[i]) * (LL)(pow(10, base))) % 7 == remain) { continue; } else cnt++; } } cout << cnt << endl; return 0; }
点赞 回复 分享
发布于 2018-09-20 21:23

相关推荐

断电再接线:1. 简历排版方面,你这内容比较少,一页放完。各模块之间建议用明显的分隔线分开,现在一眼看上去非常乱。教育经历留白太多。项目经历格式不统一。 2. 第一个项目,硬件设计太笼统,硬件架构规划是指板级电路设计还是FPGA逻辑设计?FPGA时序逻辑设计具体指的什么?实现的三个低速协议以及使用协议进行控制时序,是指什么? 3. 第二个项目,我觉得你可以和第一个项目整合一下,合并为一个项目。第二个项目说实话随便买个zynq开发板都有一直petalinux的教程,作为一个独立的项目不合适的,更像是一个小作业。 4. 第三个项目,项目内容这里,其实和环境搭建之类的东西提一嘴就好了,环境准备和编译安装工具链这种东西没多大必要写,实在要写的话可以 说 使用docker 独立sdk环境之类的。你说的这个工具我没用过,我用的比较多的是busybox和buildroot,是基于menuconfig进行配置的,如果scratch也是类似的模式的话,那我觉得这个项目也经不起细推。你可以往内核裁剪那方向靠,我说的这两个工具你也可以看看。 5. 你熟悉这些接口时序的话,你可以进一步去看一下驱动开发,然后面试的时候突出这个作为重点。第三个项目也可以将驱动开发给补充进去。因为单编内核和构建文件系统,其实很多时候是体力劳动。 6. 特长这里,独立成一个荣誉奖项的模块,把你获得的奖学金和竞赛奖项放一起。数模的话,写了国赛,美赛就不用写了。 7. 总的来说可以了,你简历上写的东西你只要都熟悉,找个实习还是没问题的。 8. 嵌入式分为硬件,底层软件和应用软件,看你的经历我建议你往底层靠,多去熟悉常用的通信接口,去看内核和驱动,网络编程这块也可以去了解一下。然后去**刷刷hot100
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务