题目:
注意: 递归实现求最早,最晚开始时间,值得注意的是最晚开始时间,被依赖的科目的最晚开始时间应该随着依赖科目的出现而不断减小
代码:(递归实现)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
static HashMap<Integer,Integer>reply;
static int n;
static int[]day;
static ArrayList<Integer>[]temp;
public static void main(String[]args){
Scanner in=new Scanner(System.in);
n=in.nextInt();//训练天数
int m=in.nextInt();//科目数量
reply=new HashMap<>();//依赖关系
day=new int[m+1];
temp=new ArrayList[m+1];
for (int i = 1; i <= m; i++) temp[i]=new ArrayList<>();
for(int i=1;i<=m;i++){
reply.put(i,in.nextInt());
}
for (int i = 1; i <=m ; i++) {
day[i]=in.nextInt();
}
//temp存放依赖i科目的科目
for (int i = 1; i <=m; i++) {
for (int j = 1; j <=m; j++) {
if (reply.get(j)==i){
temp[i].add(j);
}
}
}
//最早开始时间
for (int i = 1; i <= m; i++) {
System.out.print(tBeginMin(i)+" ");
}
System.out.println();
//能否训练完
for (int i = 1; i <= m; i++) {
if(tBeginMin(i)+day[i]-1>n)return;
}
//最晚开始时间
for (int i = 1; i <=m; i++) {
System.out.print(tBeginMax(i)+" ");
}
}
public static int tBeginMin(int i){
int t=1;
if (reply.get(i)!=0){
t=day[reply.get(i)]+tBeginMin(reply.get(i));
}
return t;
}
static public int tBeginMax(int i){
int tMax=Integer.MAX_VALUE;
int t=n-day[i]+1;
if (temp[i].size()!=0){
for(int j:temp[i]){
tMax=Math.min(tBeginMax(j),tMax);
}
t=tMax-day[i];
}
return t;
}
}