给 n 个任务,有些任务会有前驱任务,不相关的任务可以同时做,求把这些任务做完的最少时间是多少。
比较水的一道题,任务能尽早开始就尽早开始做(从时间点0开始),如果有前驱任务,就要把前驱任务完成的时间也加上,完成时间最长的任务的时间就是答案
代码:
#include <iostream> #include <cstring> #include <vector> using namespace std; const int MAX = 10005; const int INF = 0x3fffffff; vector<int> pre[MAX]; int value[MAX]; int finish[MAX]; int n, maxn = 0; int dfs(int i, int now); int main(){ //freopen("input.txt", "r", stdin); scanf("%d", &n); for(int i=1; i<=n; i++){ scanf("%d", value+i); int m; scanf("%d", &m); for(int j=1; j<=m; j++){ int t; scanf("%d", &t); pre[i].push_back(t); } } memset(finish, -1, sizeof(finish)); for(int i=1; i<=n; i++){ maxn = max(maxn, dfs(i, 0)); } // for(int i=1; i<=n; i++){ // cout << finish[i] << " "; // } cout << maxn; } int dfs(int i, int now){ if(finish[i] != -1) return finish[i]; int finishTime = value[i]; for(int j=0; j<pre[i].size(); j++){ finishTime = max(finishTime, dfs(pre[i][j], 0) + value[i]); //有前驱任务,就加上前驱任务完成的时间 } finish[i] = finishTime; return finish[i]; }
时间: 2024-11-09 10:39:51