此代码为考研机试练习,未考虑任何优化策略,同为小白可以稍稍借鉴一下,大佬不喜勿喷。
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n,m;//n:限制天数 m:科目个数
cin>>n>>m;
int p[m+1];//p[i]为i号科目所依赖的科目编号
int i,j;
for(i=1;i<=m;i++)
cin>>p[i];
int t[m+1];//t[i]为i号科目所需时间
for(i=1;i<=m;i++)
cin>>t[i];
int Min[m+1],Max[m+1];//Min[i]为i号科目最早开始时间 Max[i]为最晚开始时间
int e[m+1];//e[i]为i号科目最早结束时间
for(i=1;i<=m;i++)
{
if(p[i]==0)//若i号科目不依赖任何科目
{
Min[i]=1;//最早从第一天开始
e[i]=t[i];//最早结束时间为所花费的时间
}
}
for(i=1;i<=m;i++)
{
if(p[i]==0)
continue;
for(j=1;j<i;j++)
{
if(p[i]==j)//若i号科目依赖j号科目
{
Min[i]=Min[j]+t[j];//i最早开始时间=j最早开始时间+j花费时间
e[i]=Min[i]+t[i]-1;//i最早结束时间=i最早开始时间+i花费时间-1
}
}
}
int et=0;
for(i=1;i<=m;i++)
et=max(et,e[i]);//et为所有科目最早结束时间中最晚的一个
if(et>n)//若最晚的最早结束时间晚于限制天数
{
for(i=1;i<=m;i++)
cout<<Min[i]<<" ";//无法完成全部训练,只输出最早开始时间
return 0;
}
//若可以完成全部训练
for(i=1;i<=m;i++)
cout<<Min[i]<<" ";//输出最早开始时间
cout<<endl;
//i事件最晚开始时间=i事件的下一个事件的最晚开始时间-i事件花费的时间
//注意一个科目可能被多个科目所依赖
for(i=m;i>=1;i--)//从后往前找
{
int flag=0;//flag=1表明i被依赖
int temp=400;
for(j=i+1;j<=m;j++)
if(i==p[j])//若i被j所依赖
{
flag=1;
temp=min(temp,Max[j]);//temp为依赖i的科目中的最早的最晚开始时间,若不是这样,则其他依赖i的科目可能无法完成
}
if(flag==1)
Max[i]=temp-t[i];
else//若此事件不被任何事件依赖
Max[i]=n-t[i]+1;//此事件最晚开始时间=限制天数-此事件花费时间+1
}
for(i=1;i<=m;i++)
cout<<Max[i]<<" ";//输出最晚开始时间
return 0;
}
这是一个处理科目依赖关系的问题,程序接收科目数量、限制天数及每个科目的依赖和所需时间,计算每科的最早开始和最晚开始时间。如果所有科目能在限制天数内完成,则输出最早开始时间,否则只输出最早开始时间。最后,程序还计算了最晚开始时间。





