zoukankan      html  css  js  c++  java
  • 电子数字 网易游戏在线笔试 第一题 hihocoder

    题目链接 http://hihocoder.com/contest/ntest2016spring1/problem/1

    这个题目有几个算法考点:

    (1)对于一个LED数码管(由7个发光二极管封装在一起,对应的二极管编号见所给链接),给你一串整数,每个数字表示对应的二极管亮,其他二极管明暗未知,由该串数据求出该数码管能表示出什么数字。

    思路:就是将1~7数字(表示对应的二极管亮)映射到数组(vector<int>),表示哪些数字是需要该二极管灯亮。

    map<int, vector<int>*> dic;
    vector<int> v1 = { 2,3,5,6,7,8,9,0};//意思就是2,3,5,6,7,8,9这几个数字需要1号二极管亮!
    vector<int> v2 = {4,5,6,8,9,0 };
    vector<int> v3 = { 1,2,3,4,7,8,9,0 };
    vector<int> v4 = {2,3,4,5,6,8,9};
    vector<int> v5 = { 2,6,8,0 };
    vector<int> v6 = { 1, 3, 4, 5, 6, 7,8,9,0 };
    vector<int> v7 = { 2, 3, 5, 6, 8, 9, 0 };
    dic[1] = &v1;
    dic[2] = &v2;
    dic[3] = &v3;
    dic[4] = &v4;
    dic[5] = &v5;
    dic[6] = &v6;
    dic[7] = &v7;

    然后,利用哈希表map<int,int>来统计输入的数据串究竟能够表示出什么数字,需要求各个发光二极管所能表示的数字取交集,得到的就是该串LED数码管还能表示的数字。

    (2)求给定一个正数N,和K个LED数码管,其中每个数码管可以表示出的数字是有限的,用vector<set<int>>存储,vector[0]这个数字集合就是第一个LED数码管所能表示的数字,并且第一个数码管对应最高位,整数N前面可以补零。求出数码管所能表示出的所有比N小的组合形式个数!(这个是题目的要求,将条件改为求所有小于等于N的组合形式个数,是不是要更复杂?自己将这个问题单独罗列出来,放到最下面去,构成问题3,同时自己将利用递归来实现这个函数)

    下面是源代码(能通过题目已经给出的那个测试用例,其他还未知):

    #include<iostream>
    #include<vector>
    #include<string.h>
    #include<algorithm>
    #include<map>
    #include<set>
    using namespace std;
    int main()
    {
    
        map<int, vector<int>*> dic;
        vector<int> v1 = { 2,3,5,6,7,8,9,0};
        vector<int> v2 = {4,5,6,8,9,0 };
        vector<int> v3 = { 1,2,3,4,7,8,9,0 };
        vector<int> v4 = {2,3,4,5,6,8,9};
        vector<int> v5 = { 2,6,8,0 };
        vector<int> v6 = { 1, 3, 4, 5, 6, 7,8,9,0 };
        vector<int> v7 = { 2, 3, 5, 6, 8, 9, 0 };
        dic[1] = &v1;
        dic[2] = &v2;
        dic[3] = &v3;
        dic[4] = &v4;
        dic[5] = &v5;
        dic[6] = &v6;
        dic[7] = &v7;
    
        int len;//测试点个数
        while (cin >> len && len != 0){
        //cin >> len;
            for (int i = 0; i < len; i++){
                int K, N;
                cin >> K >> N;
                vector<set<int>> back(K,set<int>());
                for (int j = 0; j < K; j++){//处理K行数据
                    char str[100];
                    vector<int> data;
                    cin.get();
                    cin.getline(str, 100, '
    ');
                    for (int i = 0; i < strlen(str); i++)//提取一行中的整数,保存到data当中,可以对其排序
                    {
                        if (str[i] != ' '){
                            int num = str[i] - '0';
                            data.push_back(num);
                        }
                    }
                    sort(data.begin(), data.end());
                    map<int, int> inter;
                    for (int s1 = 0; s1 < 10; s1++){
                        inter[s1] = 0;
                    }
                    inter[0] = 0;
                    for (int k = 0; k < data.size(); k++){//将该二极管对应的备选数字添加到back中去,已经自动去重
                        vector<int>* ptr = dic[data[k]];
                        for (auto it = (*ptr).begin(); it != (*ptr).end(); it++){
                            inter[*it]++;
                        }
                    }
                    for (int s1 = 0; s1 < 10; s1++){
                        if (inter[s1] >= data.size())
                            back[j].insert(s1);
                    }
                }//已经得到一个测试点的备选数字
                vector<int> div;
                for (int count = 0; count < K; count++){
                    int temp = N % 10;
                    div.push_back(temp);//div最前面是个位数字,back最前面是最左边的二极管对应最高位数字
                    N=N/10;
                }
                int count = 0;
                for (int tag = 0; tag < K; tag++){
                    auto it = back[tag];
                    int num = div[K - tag - 1];
                    int count2 = 0;
                    for (auto it2 = it.begin(); it2 != it.end(); it2++){
                        if (*it2 < num){
                            int sum = 1;
                            for (int s1 = tag + 1; s1 < K; s1++)
                                sum *= back[tag].size();
                            count += sum;
                        }                    
                    }
                }
                cout <<"结果:"<<count << endl;
            }
        }
        return 0;
    }

     (3)问题3

    假定给自己一个数N,已经将其从最高位到最低位存储到了vector<int>val中(val[0]就是最高位),同时用vector<vector<int>>nums,来表示各个LED数码管能够表示的数字,求出所有LED数码管能表示出的小于等于N的数的总数量。函数接口 void helper(vector<vector<int>>& nums,vector<int>& val,int pos,int &count),

    代码实现如下:

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    void helper(vector<vector<int>>& nums, vector<int>& val,int pos,int& count){ for (auto it = nums[pos].begin(); it != nums[pos].end();it++){ if (*it < val[pos]){ int count1 = 1; for (int i = pos + 1; i < nums.size(); i++){ count1 = count1*nums[i].size(); } count += count1; } else if (*it == val[pos]){ helper(nums, val, pos + 1, count); } } } int main() { vector<int> val = {2,5,1}; vector<vector<int>> nums = { { 1, 2 }, { 3,5 }, { 0,2 } }; int count = 0; int pos = 0; helper(nums, val, pos, count); cout << "count=" << count << endl; return 0; }
    手里拿着一把锤子,看什么都像钉子,编程界的锤子应该就是算法了吧!
  • 相关阅读:
    CSS中position小解
    position
    mac默认安装postgresql, 如何让postgresql可以远程访问
    The data directory was initialized by PostgreSQL version 9.6, which is not compatible with this version 10.0.
    active admin gem error
    psql 无法添加超级用户
    ubuntu 15.04 安装Balsamiq Mockups 3
    Rails html 写public里图片的路径
    rails c 历史命令
    undefined local variable or method `per' for []:ActiveRecord::Relation
  • 原文地址:https://www.cnblogs.com/chess/p/5294073.html
Copyright © 2011-2022 走看看