hw机试后感

hw机试后感

case1,简单,逗号隔开的数组,找出素数去重,排序

case2,动态规划,8个任务,分布式计算,给出每个任务的子任务数量和所需服务器数量,服务器数量必须全部满足才能运行一个大任务。
我将其抽象成图的最大路径查找,利用递归,最后因为判断条件未考虑全,时间只剩5min不想改了就直接教了,过了40%。
提交的代码
#include <iostream>

using namespace std;

struct task
{
    int file_num, service_num;
};


    int n, files = 0, service = 0, max_files = 0;
    int sta[8], p = 0;
    task tasks[8];

    void find_maxfiles(int a)
    {
        service += tasks[a].service_num;
        files += tasks[a].file_num;
        if(service == n && files > max_files)
        {
            max_files = files;
            service -= tasks[a].service_num;
            files -= tasks[a].file_num;
        }
        else if(service < n)
        {
            sta[p++] = a;
            int flag;
            for(int i = 0; i < 8; i++)
            {
                flag = 0;
                for(int j = 0; j < p; j++)
                    if(sta[j] == i)
                    {
                        flag = 1;
                        break;
                    }
                if(flag == 1 || i == a)
                    continue;
                find_maxfiles(i);
            }
        }
        p--;
    }
int main()
{
    tasks[0].file_num = 300;
    tasks[0].service_num = 20;
    tasks[1].file_num = 500;
    tasks[1].service_num = 30;
    tasks[2].file_num = 620;
    tasks[2].service_num = 50;
    tasks[3].file_num = 370;
    tasks[3].service_num = 30;
    tasks[4].file_num = 400;
    tasks[4].service_num = 50;
    tasks[5].file_num = 450;
    tasks[5].service_num = 30;
    tasks[6].file_num = 380;
    tasks[6].service_num = 40;
    tasks[7].file_num = 150;
    tasks[7].service_num = 10;

    cin >> n;
    if(n < 10)
        return 0;
    if(n >= 260)
    {
        cout << 3170;
        return 0;
    }
    n = n - n % 10;
    for(int i = 0; i < 8; i++)
    {
        files = 0;
        service = 0;
        p = 0;
        find_maxfiles(i);
    }

    cout << max_files;
    return 0;
}

改进算法:考虑到如下情况:总数为260,加入除了其中一个需要50个服务器的任务外,其他服务器都满足,此时 n应为210;若n在210到260区间,也只能是输出满足210的条件;(未经过hw机试的测试用例验证,仅自己模拟数据,感觉应该能过)
#include <iostream>

using namespace std;

struct task
{
    int file_num, service_num;
};


    int n, files = 0, service = 0, max_files = 0;
    int sta[8], p = 0;
    task tasks[8];

    void find_maxfiles(int a)
    {
        service += tasks[a].service_num;
        if(service > n)
        {
            service -= tasks[a].service_num;
            return ;
        }
        files += tasks[a].file_num;
        if(service <= n)
        {
            if(files > max_files)
            {
                max_files = files;
            }
            sta[p++] = a;
            int flag;
            for(int i = 0; i < 8; i++)
            {
                flag = 0;
                for(int j = 0; j < p; j++)
                    if(sta[j] == i)
                    {
                        flag = 1;
                        break;
                    }
                if(flag == 1 || i == a)
                    continue;
                find_maxfiles(i);
            }
            service -= tasks[a].service_num;
            files -= tasks[a].file_num;
        }
        p--;
    }
int main()
{
    tasks[0].file_num = 300;
    tasks[0].service_num = 20;
    tasks[1].file_num = 500;
    tasks[1].service_num = 30;
    tasks[2].file_num = 620;
    tasks[2].service_num = 50;
    tasks[3].file_num = 370;
    tasks[3].service_num = 30;
    tasks[4].file_num = 400;
    tasks[4].service_num = 50;
    tasks[5].file_num = 450;
    tasks[5].service_num = 30;
    tasks[6].file_num = 380;
    tasks[6].service_num = 40;
    tasks[7].file_num = 150;
    tasks[7].service_num = 10;

    cin >> n;
    if(n < 10)
        return 0;
    if(n >= 260)
    {
        cout << 3170;
        return 0;
    }
    n = n - n % 10;
    for(int i = 0; i < 8; i++)
    {
        files = 0;
        service = 0;
        p = 0;
        find_maxfiles(i);
    }

    cout << max_files;
    return 0;
}


case3:给出一个数组,要求按输入的命令做出操作,U a b k 为更新从下标a到下标b(含)的值为其的k次方。可能是超过64bit的大数,因此要对1234567891取余数; C a b为求下标a 到 b(含)的数的和,并输出。
原谅我太菜,之前ccf就卡在大数上面了,当时思路也有,最简单的,用string进行操作多次的加减操作,但怕时间复杂度太大,而且因为第二题刚开始打算偷鸡,浪费了半个小时,导致时间也不太够了,放弃了。
#笔试题目#
全部评论
机试已经开始了吗?为什么我没收到通知😂
点赞 回复
分享
发布于 2020-02-13 11:26
没收到机试是不是凉凉了
点赞 回复
分享
发布于 2020-02-13 11:58
滴滴
校招火热招聘中
官网直投
过一道题就行了
点赞 回复
分享
发布于 2020-02-13 15:28
2020华为校招补录,欢迎投递产品数据工程师,直接安排机试+面试,免筛选 https://www.nowcoder.com/discuss/365608
点赞 回复
分享
发布于 2020-02-13 16:15
老哥 问下华为机试平台是用的牛客网吗?
点赞 回复
分享
发布于 2020-02-13 23:08

相关推荐

点赞 12 评论
分享
牛客网
牛客企业服务