#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
struct Project{
int item; //记录依赖项
int date;
int earlyTime;
int lastTime;
bool isEnd;
int later; //记录它后面一个的最晚开始时间的最早的
};
int main(){
int n,m;
Project myProject[101];
bool canOut = true;
scanf("%d%d",&n,&m);
for(int i = 0;i < m;i++){
myProject[i].isEnd = true;
myProject[i].later = n;
}
for(int i = 0;i < m;i++){
scanf("%d",&myProject[i].item);
}
for(int i = 0;i < m;i++){
scanf("%d",&myProject[i].date);
}
//找到最早开始时间
for(int i = 0;i < m;i++){
int num = myProject[i].item;
if(num == 0){
//说明该项目不依赖其他的 可以从第一天开始训练
myProject[i].earlyTime = 1;
}else{
//说明该项目依赖其他的 num是它依赖的项目 num-1是num的数组下标
myProject[i].earlyTime = myProject[num-1].earlyTime + myProject[num-1].date;
}
printf("%d ",myProject[i].earlyTime);
}
//如果超时 则不用计算最晚时间了 不超时才计算最晚时间
//开始的时候就是忽视了这一点 才没有得全分
for(int i = 0;i < m;i++){
if(myProject[i].date+myProject[i].earlyTime-1>n){
canOut = false;
break;
}
}
//不超时 才需要计算最晚开始时间
if(canOut) {
//此时为有最晚开始时间的情况
for (int i = 0; i < m; i++) {
myProject[i].lastTime = n - myProject[i].date + 1;
//给每一个元素的最晚时间都设为假设它后面没有元素的最晚时间
}
for (int i = m - 1; i >= 0; i--) {
int num = myProject[i].item;
if (num != 0) {
//num-1是它依赖的事物的下标
myProject[num - 1].isEnd = false;//如果isEnd为false 说明后面有人依赖他
if (myProject[num - 1].later >= myProject[i].lastTime) {
myProject[num - 1].later = myProject[i].lastTime;
//用later记录它后面的元素的最晚开始时间
myProject[num-1].lastTime = myProject[num-1].later - myProject[num-1].date;
}
}
}
printf("\n");
for (int i = 0; i < m; i++) {
printf("%d ", myProject[i].lastTime);
}
}
}
2022-12-2 训练计划
最新推荐文章于 2024-11-07 23:24:07 发布