解题思路:
1.最早开始时间:判断是否有依赖科目,有的话,依赖科目完成时间的下一天就是该科目最早开始时间。否则,第一天就是最早开始时间。
2.最晚开始时间:从后往前判断,根据当前科目计算出依赖的科目的最晚开始时间,如果有多科目依赖某一科目,要进行比较,选出最早的最晚开始时间。
#include<bits/stdc++.h>
using namespace std;
int depend[105]; //记录每个科目的依赖科目编号
int last[400]; //最晚开始天数
int first[400]; //最早开始时间
int days[400]; //每个科目需要的时间
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>depend[i];
}
for(int i=1;i<=m;i++) cin>>days[i];
int flag=0; //用于标记是否有科目没法在规定时间内完成
for(int i=1;i<=m;i++)
{
if(depend[i]==0) first[i]=1;
else
{
first[i]=first[depend[i]]+days[depend[i]]; //如果有依赖科目,注意边界的判断
}
if(first[i]+days[i]-1>n) flag=1; //该科目没有在规定时间内完成
}
for(int i=1;i<=m;i++) cout<<first[i]<<' ';
if(flag==0) //所有科目都能完成,根据当前科目计算依赖的科目的最晚开始时间
{
cout<<endl;
for(int i=m;i>=0;i--) //从后往前计算
{
if(depend[i]!=0) //有依赖的科目
{
int t=depend[i]; //依赖科目编号
int lt=n-days[i]+1; //当前科目最晚开始时间的可能取值
if(last[i]==0) last[i]=lt; //如果之前没有计算出最晚开始时间,则使用该最晚开始时间
else
{
if(last[t]>lt) last[t]=lt; //否则,要与之前计算出的最晚开始时间进行判断
}
int tt=last[i]-days[t]; //对于依赖的科目也是同理
if(last[t]==0) last[t]=tt;
else
{
if(last[t]>tt)
{
last[t]=tt;
}
}
}
else //没有依赖科目
{
int t=n-days[i]+1;
if(last[i]==0) last[i]=t; //也要进行判断
else
{
if(t<last[i]) last[i]=t;
}
}
}
for(int i=1;i<=m;i++) cout<<last[i]<<' ';
}
return 0;
}