0
点赞
收藏
分享

微信扫一扫

2022年春华为机试心得

点亮自己的那盏灯 2022-04-21 阅读 43

新人考试(100分)

有10道2分题,10道4分题,5道8分题,满分100分,答对得分,答错不得分,累计错三道则停止作答结算分数

输入n分

输出作答情况的数量m

#include<bits/stdc++.h>
using namespace std;
// we have defined the necessary header files here for this problem.
// If additional header files are needed in your program, please import here.
int timu[]={2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,8,8,8,8,8};
int tag[25]={};
int times=0;
int sum=0;
int score;
void dfs(int n,int now){
    if(now<score){
        dfs(n+1,now+timu[n]);
        if(times<2){
            times++;
            dfs(n+1,now);
            times--;
        }
    }
    else if(now==score)sum++;
    else return;
}
int main()
{
    cin>>score;
    // please define the C++ input here. For example: int a,b; cin>>a>>b;;
    // please finish the function body here.
    // please define the C++ output here. For example:cout<<____<<endl;
    dfs(0,0);
    cout<<sum;
    return 0;
}

子树替换(200分)

第一行以数组的形式输入一个层次遍历的树,无子节点则以0标识;

第二行输入从根节点到所替换节点的路径;

第三行输入要替换的子树Q,输入方式同第一行;

如图示则输入[1,2,3,0,5,0,4]

锁定4号结点,则输入路径为\1\3\4

实际例题中节点上的序号可能重复,但路径保证唯一

替换子树要求:替换节点的所有子节点清空;子树Q完全存在于得到的新树;原来的树中与替换节点无关的节点完全保留

例如用树6->7,8(6是根节点,7、8分别为左右子节点)替换\1\3,则得到的新树应为[1,2,6,0,5,7,8]

最终输出是不输出空节点,即最终输出[1,2,6,5,7,8]

#include<bits/stdc++.h>
using namespace std;
// we have defined the necessary header files here for this problem.
// If additional header files are needed in your program, please import here.
vector<int> origin,dir,sub;
void clear(int node){
    if(node<=origin.size())origin[node-1]=0;
    else return;
    clear(node*2);
    clear(node*2+1);
	return ;
}
void fun(int node,int tag){
    if(tag<=sub.size()){
        if(node<origin.size()){
            origin[node-1]=sub[tag-1];
        }
        else{
            origin.push_back(sub[tag-1]);
        };
        fun(node*2,tag*2);
        fun(node*2+1,tag*2+1);
    }
    else return;
}
int main()
{
    string s;
    cin>>s;
    for(int i=0;i<s.length();i++){
        if(s[i]!=','&&s[i]!='['&&s[i]!=']')origin.push_back(s[i]-'0');
    }
    cin>>s;
    for(int i=0;i<s.length();i++){
        if(s[i]!='/')dir.push_back(s[i]-'0');
    }
    cin>>s;
    for(int i=0;i<s.length();i++){
        if(s[i]!=','&&s[i]!='['&&s[i]!=']')sub.push_back(s[i]-'0');
    }
//    for(int i=0;i<origin.size();i++)cout<<origin[i];
//    for(int i=0;i<dir.size();i++)cout<<dir[i];
//    for(int i=0;i<sub.size();i++)cout<<sub[i];
    int i=1;
    int node=1;
    while(i<dir.size()){
        if(origin[node*2-1]==dir[i])node=node*2;
        else if(origin[node*2]==dir[i])node=node*2+1;
        i++;
    }
    //for(int i=0;i<origin.size();i++)cout<<origin[i];
    clear(node);
    fun(node,1);
    // please define the C++ input here. For example: int a,b; cin>>a>>b;;
    // please finish the function body here.
    // please define the C++ output here. For example:cout<<____<<endl;
    cout<<'['<<origin[0];
    for(int i=1;i<origin.size();i++)if(origin[i]!=0)cout<<','<<origin[i];
    cout<<']';
    return 0;
}

寻找最短路径(300分)

给定一个树,树上的节点标号x表示在该节点能处理x个任务,x同时表示在该节点停留的时间,此外,x与y节点如果存在父子节点关系,那么|x-y|表示从x节点跳转到y节点的时长,同时也是y节点跳转到x节点的时长。

输入四行

第一行:节点总数

第二行:层次遍历树的每个节点,得到每个节点标号组成的数组

第三行:层次遍历树的每个节点,得到每个节点父节点的标号组成的数组,一个节点最多有两个子节点,根节点的父节点标号用0表示

第四行:任务总数

输出:完成任务所用的最短时间;若不能完成任务,则输出-1

不规定路径的起点,将该树当成图看待,树中的任意一段路径上的节点序号之和大于或等于任务总数,那它就是可以用于考虑用时是否最短的路径,路径中的每个节点只能出现一次。

这道题还是用dfs做就好了,所有可能的路径遍历一次,看看符合条件的路径中哪条路径用时最短,记得用一个标签标识某个节点是不是已经走过了,小编当时敲完了代码提交之后编译错误,然后就时间结束了,呜呜呜~

总得来说题不是很难,打字快一点应该可以做得完!

举报

相关推荐

0 条评论