很可惜,当时没做出来,写了个bug调了一个多小时,但是思路是对的。
leetcode刷久了,对各种输入的处理能力不够,第一题本来很简单,也是写了一个bug把心态搞炸了。后续几乎没什么面试机会了。4月末求上天赐我一个offer吧。我真的熬不住了。题也刷了,面经也背了,卵用没有一个,offer至今为0。
第三题
思路
使用map映射 使用拓扑排序判环
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
const int INF = 0x3f3f3f3f;
int member[N], stackSize[N], stks[N];
vector<int> G[N];
int deg[N];
int m;
unordered_map<int, vector<int>> pm;
unordered_map<int, int> mp;
bool topsort(){
queue<int> q;
int cnt = 0;
for(int i = 0; i < m; i++){
int u = stks[i];
if(!deg[u]) q.push(u);
}
while(q.size()){
auto t = q.front();
q.pop();
cnt++;
for(int i = 0; i < G[t].size(); i++){
int v = G[t][i];
deg[v]--;
if(deg[v]==0) q.push(v);
}
}
return cnt == m;
}
int dfs(int u){
int tempR = stackSize[u];
for(auto it: pm[u]){
int k = dfs(it);
tempR = max(tempR, k + stackSize[u]);
}
return tempR;
}
int main(){
char c;
string t, u;
scanf("%d", &m);
bool flag = false;
for(int i = 0; i < m; i++) scanf("%d", member+i);
getchar();
memset(deg, 0, sizeof deg);
for(int i = 0; i < m; i++){
getline(cin, t);
vector<int> vt;
for(int v = 0; v < t.size();){
int j = v;
while(j < t.size() && t[j]!=' ') j++;
u = t.substr(v, j-v);
vt.push_back(stoi(u));
v = j+1;
}
if(vt.size()!= member[i]+2) flag = true;
else{
int num = vt[0];
stks[i] = num;
stackSize[vt[0]] = vt[1];
for(int l = 2; l < vt.size(); l++){
deg[vt[l]]++;
G[num].push_back(vt[l]);
}
reverse(vt.begin(), vt.end());
vt.pop_back();
vt.pop_back();
pm[num] = vt;
}
}
if(flag) {
puts("NA");
return 0;
}else if(!topsort()){
puts("R");
return 0;
}
int res = 0;
for(auto it: pm){
auto uu = it.first;
res = max(res, dfs(uu));
}
printf("%d\n", res);
return 0;
}