AcWing 4892. 训练计划
原题链接
简单
作者:
Puiple
,
2023-12-01 18:55:06
,
所有人可见
,
阅读 47
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int r,t;
};
const int N=110;
Node node[N];
int n,m;
vector<vector<int>>rd;
int early[N],late[N];
void test01()
{
int flag=0;
cin>>n>>m;
rd.resize(m+1);
for(int i=1;i<=m;i++)
{
cin>>node[i].r; //i依赖于r
rd[node[i].r].push_back(i); //r被i依赖,r<i
}
for(int i=1;i<=m;i++)
cin>>node[i].t;
for(int i=1;i<=m;i++) //若所有项目最早开始时间 t1+t-1<=n,则可以完成,即可以继续计算最晚开始时间
{
if(node[i].r==0)
early[i]=1;
else{
early[i]=early[node[i].r]+node[node[i].r].t; //即i所依赖的项目结束后最早才可以开始
}
if(early[i]+node[i].t-1>n)
flag=1;
}
for(int i=1;i<=m;i++)
cout<<early[i]<<" ";
cout<<endl;
if(flag==1)
return ;
for(int i=m;i>=1;i--)
{
if(rd[i].empty()) //表明i不被依赖
late[i]=n-node[i].t+1;
else{
int time=n;
for(auto e:rd[i])
time=min(late[e],time); //若i被多个项目依赖,找到最晚时间最小的那一个
late[i]=time-node[i].t;
}
}
for(int i=1;i<=m;i++)
cout<<late[i]<<" ";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
test01();
}