华为911机考第一题(软件)

说明

其实我后面两道题都没看。。。全搞第一题了,最开始想成图的拓扑了,还构建了一个图出来,代码越来越多,越来越离谱,后面索性就暴力递归了,还好数据比较弱飘过。祈祷大家都能找到心仪的工作!

题目

我有点忘了题目是啥了大概说一下吧
第一行输入神经网络的节点个数(一个节点代表一个算子)
第二行开始输入每个节点的名字 花费时间 关联节点

输出完成这个网络所需要的时间;
样例是这样的大概(吐槽一下样例好像不是一个空格分开的,我是按一个空格划分字符串的,最后直接复制输入到我的IDE连输入都出错。。。)
输入:

4
softmax 10 1 2
relu 5
conv1 1 3
softmax 2

输出

15

基于上面的输入我们可以画个图(稍等我找一下画图的嗷)image

代码

#include <iostream>
#include <vector>
#include <sstream>
using namespace std;

vector<string> names; //神经网络名称 ,数组的下标就表示第几个节点,从0开始
vector<int> costs; //网络花费时间
vector<vector<int>> nexts; //网络下一个关联节点

int ans = 0;
int end_time[101] = {0}; //记录当前这个节点结束花了多少时间

void solution(int i, int endTime){
    //i:当前是第几个节点
    //endTime:当前节点的开始时间
    int now = endTime + costs[i]; //当前节点结束后,算上之前节点的所用时间
    if(now > end_time[i]) {
        //如果时间比当前记录的  结束这个节点的总时间 长,就更新

        end_time[i] = now;
        ans = max(ans, now);
        //以 这个节点为基础向下更新
        //有个问题:如果这一层,的下一个节点比前一个还长怎么办?那上一个节点的更新岂不是没用了
        //答案:不一定,虽然说一层的不一定有你时间长,不代表我下面的所有关联节点都比你时间短
        //同样后面比前面节点小也要继续深度遍历
        //再看now > end_time[i],是每个节点的结束时间,所以保证了每个节点肯定能往下遍历
        for (int index : nexts[i]) {
            //如果没关联,跳过了(next[i] = {}的情况)
            solution(index, now);
        }
    }
}

int main() {
    int T;
    cin >> T;
    int n = T + 1; //这一步很关键,也是我考试的时候遇到的坑,一定要+1
    //因为下面的getline会捕获cin >> T;的cin, 也就是你会少输入一次,所以要加一次才行
    while(n--){
        string s;
        getline(cin, s); //输入字符串
        if((int)s.size() == 0) continue;
        string in = s;
        stringstream ss(in);
        //in得到的是   神经网络名字+空格+cost+空格。。。+关联节点
        vector<string> arr;
        while(getline(ss, in, ' ')){
            arr.push_back(in);
        }
        //arr把in按空格区分了
        names.push_back(arr[0]); //第一个就是名字,后面好像用不到
        costs.push_back(stoi(arr[1]));//花费
        //剩下的就是关联节点了
        vector<int> temp_nexts;
        for(int i = 2; i < arr.size(); ++i){
            if(arr[i].empty()) continue;
            temp_nexts.push_back(stoi(arr[i]));
        }
        //next存储剩下的关联节点
        nexts.push_back(temp_nexts);
    }
    //打印
    for(int i = 0; i < costs.size(); ++i){
        cout<<i<<": "<<names[i]<<"  "<<costs[i]<<endl;
    }
    cout<<endl;
    for(int i = 0; i < nexts.size(); ++i){
        cout<<i<<": ";
        for (int j : nexts[i]) {
            cout<<j<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
    //都要遍历,防止存在类似森林的情况
    for(int i = 0; i < T; ++i){
        solution(i, 0);
    }
    cout<<ans<<endl;
}

补充

输入的情况可以打印一下image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值