华为fx测试题

1.
小K是X区域的销售经理,他平常常驻“5”城市,并且经常要到“1”、“2”、“3”、“4”、“6”城市出差。当机场出现大雾情况时,会导致对应城市的所有航班的起飞及降落均停止(即不能从该城市出发,其他城市也不能到达该城市)。小K希望知道如果他需要到X城市出差时,如果遇到Y城市出现大雾,他最短的飞行时间及飞行路径。

注意:当两个城市间不可达时,消耗时间默认取1000.

各城市简的飞行时间如下表所示,加粗行代表始发城市,加粗列代表终点城市,矩阵中的值代表从始发城市飞到终点城市所耗时间(单位:小时),M代表不可达(注意飞行线程是单向的,即A->B不等于B->A),例如

(1)从1号城市飞行到4号城市花费5h,从4号城市飞到1号城市花费2h

(2)从5号城市飞行到3号城市不可达,从3号城市飞到5号城市花费7h

 1    2    3    4    5    6

1 0h 2h 10h 5h 3h M

2 M 0h 12h M M 10h

3 M M 0h M 7h M

4 2h M M 0h 2h M

5 4h M M 1h 0h M

6 3h M 1h M 2h 0h

输入描述:

输入出差城市X(X可为1、2、3、4、6)

输入大雾城市(Y可为0、1、2、3、4、5、6,可为0时代表没有城市出现大雾)

#include<cstdio>  
#include<cstring>  
#include<algorithm> 
#include<string>
#include<iostream>  
#include<string>  
#include<vector>  
#include<stack>  
#include<bitset>  
#include<cstdlib>  
#include<cmath>  
#include<set>  
#include<list>  
#include<deque>  
#include<map> 
#include<unordered_map>
#include<queue>
#include<iomanip>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;

int INF = 1000;
vector<vector<int>>dist(6, vector<int>(6));
vector<vector<int>>path(6, vector<int>(6));
deque<int>result;
void setFog(vector<vector<int>>&matrix, int city) {
            for (int i = 0; i < matrix.size(); i++) {
                     matrix[i][city] = matrix[city][i] = INF;
    }
}
void floyd(vector<vector<int>>&matrix) {
    int size = matrix.size();
    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++) {
            path[i][j] = -1;
            dist[i][j] = matrix[i][j];
        }
    for (int k = 0; k < size; k++) {
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (dist[i][k] != INF && dist[k][j] != INF
                    && dist[i][k] + dist[k][j] < dist[i][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                    path[i][j] = k;
                }
            }
        }
    }
}
void findPath(int i, int j) {
    int ci = i, ccj = j;
    while (path[i][j] != -1) {
        int cj = path[i][j];
        result.push_back(cj);
        i = cj;
    }
    result.push_front(ci);
    result.push_back(ccj);
}

int main()
{
    vector<vector<int>>matrix = { { 0, 2, 10, 5, 3, INF },
                       { INF, 0, 12, INF, INF, 10 }, { INF, INF, 0, INF, 7, INF },
                         { 2, INF, INF, 0, 2, INF }, { 4, INF, INF, 1, 0, INF },
                         { 3, INF, 1, INF, 2, 0 } };

    int end, foggy;
    cin >> end >> foggy;
    --end;
    --foggy;
    if (foggy!=-1)
        setFog(matrix, foggy);
    floyd(matrix);
      findPath(4, end);
       cout << dist[4][end] << endl;
       for (int i = 0; i < result.size(); i++)
            ++result[i];    
       if (dist[4][end] == INF)
           result.clear();
       if (result.empty())
           cout << "[]" << endl;
       else
       {
           cout << "[";
           for (int i = 0; i < result.size() - 1; ++i)
               cout << result[i] << ", ";
           cout << result.back() << "]" << endl;
       }
    return 0;
}

2.
题目描述:输入5个任务的ID,任务优先级,开始运行时间和任务运行时间,其中调度过程支持抢占,即优先级值高的任务可抢占正在运行的优先级值低的任务,最后输出前200秒,任务的调度过程

输入描述:任务信息输入格式为:[任务ID.任务优秀级.任务开始运行时间.任务运行时长];任务与任务之间使用“|”隔离;5个任务的任务ID为1-5;任务优先级范围为0-200.

输入例子:[1.80.1.10]|[2.20.11.15]|[3.50.21.10]|[4.120.31.10]|[5.100.41.10]

输出描述:任务ID.任务运行时长;任务之间使用”|”分割;如无任务运行,则任务id为0;
输出例子:0.1|1.10|2.10|3.10|4.10|5.10|2.5|0.144

大致思想就是先把任务按照时间排序.然后先放最前面的任务,看下一个任务开始的时间是否有任务在执行,之后比较优先级,如果优先级高就先执行下一个任务,第一个任务顺延.依次类推

也可以按照任务的优先级程度进行排序,然后最高的先执行,之后执行次高的如果时间不为0,则被之前的分段.

#include <iostream>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <map>
#include <limits.h>

using namespace std;

int main()
{
    int task[5][4] = { 0 };
    scanf("[%d.%d.%d.%d]|[%d.%d.%d.%d]|[%d.%d.%d.%d]|[%d.%d.%d.%d]|[%d.%d.%d.%d]",
        &task[0][0], &task[0][1], &task[0][2], &task[0][3],
        &task[1][0], &task[1][1], &task[1][2], &task[1][3],
        &task[2][0], &task[2][1], &task[2][2], &task[2][3],
        &task[3][0], &task[3][1], &task[3][2], &task[3][3],
        &task[4][0], &task[4][1], &task[4][2], &task[4][3]);
for (int i = 0; i < 5; i++){
        int min = INT_MAX;
        int id = i;
        for (int j = i; j < 5; j++)
        {
            if (task[j][2] < min)
            {
                min = task[j][2];
                id = j;
            }
        }
        for (int k = 0; k < 4; ++k)
            swap(task[i][k], task[id][k]);
    }
    int time[200] = { 0 };
    for (int i = 0; i < 5; i++)
    {
        int start = task[i][2];
        if (start >= 200)
            break;
        if (time[start] == 0)
        {
            for (int j = 0; j < task[i][3]; j++)
            {
                if (start + j >= 200) break;
                time[start + j] = task[i][0];
            }
        }
        else
        {
            int pro = 0;
            int now = time[start];
            while (pro == 0 && (start < 200 && time[start] != 0))
            {
                for (int j = 0; j < 5; j++)
                {
                    if (task[j][0] == now && task[i][1] > task[j][1])
                        pro = 1;
                }
                if (pro == 0)
                {
                    while (start < 200 && time[start] == now)
                    {
                        start++;
                    }
                }
                now = time[start];
            }
            if (time[start] == 0)
            {
                for (int j = 0; j < task[i][3]; j++)
                {
                    if (start + j >= 200) break;
                    time[start + j] = task[i][0];
                }
            }
            else
            {
                int s = start;
                while (time[s] != 0)
                    s++;
                for (int j = s - 1; j >= start; j--)
                {
                    if (j + task[i][3] >= 200)
                        continue;
                    time[j + task[i][3]] = time[j];
                }
                for (int j = 0; j < task[i][3]; j++)
                {
                    if (start + j >= 200) break;
                    time[start + j] = task[i][0];
                }
            }
        }
    }
    int cnt;
    int now;
    for (int i = 0; i < 200; i++)
    {
        if (i == 0)
        {
            now = time[i];
            printf("%d.", now);
            cnt = 1;
        }
        else
        {
            if (time[i] == now)
            {
                cnt++;
            }
            else
            {
                printf("%d|", cnt);
                cnt = 1;
                now = time[i];
                printf("%d.", now);
            }
        }
    }
    printf("%d", cnt);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
专业面试我的技巧和经验: 一、 巧妇难为无米之炊,事前做一些功课是必须的,把自己学习过的和应聘岗位相关的内容复习下,比如性能与算法岗位:本科电子信息工程和通信工程这些课程肯定学过,通信原理,信息论和编码,信号与系统,数字信号处理,复习一下掌握大概的轮廓一个星期应该差不多可以搞定. 二、 善于引导面试官,比如当面试官问到什么问题不懂的时候,避免连问几个都不懂,可以尝试这么说:我***方面的知识比较匮乏,不是很了解,但是我对***的知识还是比较熟习,我觉得***的知识在我们华为性能与算法工程师必须要掌握的吧。以我面试为例,面试问我3G和4G的关键技术,已经这些关键技术的基本原理,我是做雷达信号处理的,确实不懂。我就和面试官说:对不起,因为研究生期间主要做的雷达信号处理的工作,我对移动通信的知识了解甚少,但是我对移动通信的基础只是比如通信原理和调制解调技术还有一定的了解(当然这都是我事先复习好的),我觉得无论什么类型的通信技术都离不开这些基本的理论。接着面试官就让我说信源编码和信道编码的作用已经他们通常采用的方法,当然我也就能对答如流了。所以,引导很重要。 三、 专业面试对自己简历上不要为了蒙骗面试官,写的项目自己捡不熟悉,对简历上的东西一问三不知,语言表达不清楚,说不半天不能告诉面试官你做的工作内容和意义,这个很不好。 群面 一般10-14个人,看当天应聘的人数而定,分2组,一个话题,让排序之类的,或者辩论之类的,不同的组会抽到不同的问题,不同的地方也会有不同的问题,在这里把问题说出来没什么意义,这一轮会有很多意想不到的情况,比如这组我本来不是选为组长,但是在做总结的时候面试官让我做总结,或者突然问你刚才某某同学说的话你同意吗,或者突然说你今天脸色好像不好看之类的,所以灵机应变才是王道。群面一般要自我介绍,自我介绍要简短,不要说太多,我建议按以下几个方面说,自己学校专业、来自哪里、然后说自己学习,主要稍微说下自己的项目,说下名字就OK了,然后说自己做项目获得成果,比如发表文章,专利和之类的。然后说自己优点和缺点,一般情况下优点缺点都要说,而且我觉得最好优点缺点自己多准备几个,免得到时候你要说的前面的人都说了,就像我们这组:我开始说缺点的时候说我性格比较急,做什么事情都想快点做完,午觉也不睡,但是经常适得其反,中午不谁觉,下午就工作效率低。后面好几个同学说的时候都这么说了,惹的面试官说,你们重复一个东西说。说缺点的时候大家要慎重,不要说和自己工作相关的缺点,比如我们那个组一个同学说:我的缺点就是比较随性,重要场合经常穿拖鞋为此挨了不少批评。 面试官:。。。。(前面省略了一些),你这种随行的行为有同学提醒过你吗?
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值