题目链接:计算机软件能力认证考试系统http://118.190.20.162/view.page?gpid=T159
思路:
最早开始时间是受之前依赖的项目限制,若无依赖,第一天即可开始。若有依赖,等待前置项目完成才能开始,累加即可。
最晚开始时间在能够完成所有项目的情况下输出。受限于是否有其他项目依赖于本项目,只选择用时最长的那一项做限制。从后往前遍历。yuashi[]用来记录最原始的每个项目耗时。
100分代码:
#include <bits/stdc++.h>
using namespace std;
#define N 366
#define M 101
int rely[M];
int cost[M];
int yuashi[M];
int main()
{ int n,m;
cin>>n>>m; //n days,m 项
for(int i=1;i<=m;i++)
{
cin>>rely[i];
}
for(int i=1;i<=m;i++)
{ int c;
cin>>c;
cost[i]=cost[rely[i]]+c;
yuashi[i]=c;
}
for(int i=1;i<=m;i++)
{
cout<<1+cost[rely[i]]<<" ";
}
cout<<endl;
int max=0;
for(int i=1;i<=m;i++)
if(cost[i]>max) max=cost[i];
if(max>n) ;
else{
for(int i=m;i>=1;i--){
vector<int> berelyed;
for (int j = 1; j <=m ; ++j) {
if(rely[j]==i) berelyed.push_back(j);
}
int maxx=0;
for (int j = 0; j <berelyed.size() ; ++j) {
if(yuashi[berelyed[j]]>maxx) maxx=yuashi[berelyed[j]];
}
yuashi[i]+=maxx;
}
for(int i=1;i<=m;i++)
{
cout<<n+1-yuashi[i]<<" ";
}
cout<<endl;
}
return 0;
}