思路:
计算最早开始时间:最早开始时间的计算较为简单,对于没有依赖其它科目的科目,其最早开始时间为1;对于有依赖的科目,其最早开始时间为其依赖科目的最早结束时间+1,即
判断是否需要计算最晚开始时间:使用变量tag来记录是否需要计算最晚开始时间。在计算最早开始时间的过程中,同时计算该科目的学习结束时间,若结束时间大于总天数,则不需要计算最晚开始时间,将tag置为false。
计算最晚开始时间:计算最晚开始时间是要注意各个科目之间的依赖关系,要逆序计算每个科目的最晚开始时间,同时考虑该科目是否被依赖。逆序遍历n个科目的依赖关系数组。计算科目j时,遍历第j+1个科目到第n个科目,若科目j没有被依赖。则其最晚开始时间为:总天数m - 学习天数days[j] + 1; 若这些科目中有依赖科目j的科目k,则科目j的最晚开始时间为:科目k的最晚开始时间 - 科目j的学习天数days[j]
#include<bits/stdc++.h>
using namespace std;
int main() {
int m;
int n;
cin >> n;
cin >> m;
vector<int>sbj (m, 0);
vector<int>days(m, 0);
vector<int>res_e (m, 0);
vector<int>res_l (m, 0);
bool tag = true;
for (int i = 0; i < m; i++) {
cin >> sbj[i];
}
for (int i = 0; i < m; i++) {
cin >> days[i];
}
for (int i = 0; i < m; i++) {
if (sbj[i] == 0) { //没有依赖其它科目
res_e[i] = 1;
}
else { //依赖其它科目,需要计算被依赖科目的结束时间
res_e[i] = res_e[sbj[i] - 1] + days[sbj[i] - 1];
}
if (res_e[i] + days[i] - 1 > n) { //判断是否有科目训练不完
tag = false;
}
}
for (int i = 0; i < m; i++) { //输出最早开始时间
cout << res_e[i] << " ";
}
if (tag) { //根据tag判断是否需要计算最晚开始时间
for (int i = m - 1; i >= 0; i--) { //倒叙计算最晚开始时间
int temp = INT_MAX; //temp记录科目的边界:总天数 或 依赖给科目的科目的最晚开始时间
if (i < m - 1) {
for (int j = i + 1; j < m; j++) { //遍历后面的科目,判断当前科目是否被依赖
if (sbj[j] == i + 1) { //如果存在依赖该科目的科目
temp = min(temp, res_l[j]); //修改边界
}
}
}
if (temp == INT_MAX) { //没有被依赖的科目
res_l[i] = n - days[i] + 1;
}
else { //有被依赖的科目
res_l[i] = temp - days[i];
}
}
cout << endl;
for (int i = 0; i < m; i++) { //输出最晚开始时间
cout << res_l[i] << " ";
}
}
return 0;
}
注意:
本题要注意判断本题直接最早开始是啊金本题要注意判断最晚开始时间是否需要计算。将最早开始时间和最晚开始时间的计算分开进行
计算最晚开始时间时,使用好”各个科目的依赖关系按顺序“的条件。