说明
其实我后面两道题都没看。。。全搞第一题了,最开始想成图的拓扑了,还构建了一个图出来,代码越来越多,越来越离谱,后面索性就暴力递归了,还好数据比较弱飘过。祈祷大家都能找到心仪的工作!
题目
我有点忘了题目是啥了大概说一下吧
第一行输入神经网络的节点个数(一个节点代表一个算子)
第二行开始输入每个节点的名字 花费时间 关联节点
输出完成这个网络所需要的时间;
样例是这样的大概(吐槽一下样例好像不是一个空格分开的,我是按一个空格划分字符串的,最后直接复制输入到我的IDE连输入都出错。。。)
输入:
4
softmax 10 1 2
relu 5
conv1 1 3
softmax 2
输出
15
基于上面的输入我们可以画个图(稍等我找一下画图的嗷)
代码
#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;
}
补充
输入的情况可以打印一下