-
题目:
CCF-CSP认证考试 202212-2 训练计划 100分题解_csp训练计划-优快云博客
-
分析与代码:
/*
需要设置一个依赖映射、一个被依赖映射,如果任务没有依赖,则最早可以第一天就开始,如果任务没有
被依赖,那么最晚可以在最后一天恰好结束。
如果任务有依赖,则需要在所依赖的任务最早结束后就开始运行就可以最早开始。
若任务有被依赖,那么最晚结束必须要保证被依赖的任务最后一天恰好可以完成。
如果最早开始时间+任务运行时间>最大时间,那么就只输出一行最早开始时间就可以了。
*/
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int *u=new int[m+1];//依赖关系的正向边
int *d=new int[m+1];//作为依赖关系的反向边
int *t=new int[m+1];//时间
int *earans=new int[m+1];
int *lasans=new int[m+1];
int flag=0;//超时标志位
for(int i=1;i<=m;i++)
{
cin>>u[i];
}
for(int i=1;i<=m;i++)
{
cin>>t[i];
d[i]=0;
}
for(int i=1;i<=m;i++)
{
if(u[i]==0)
{
earans[i]=1;
}
if(u[i]!=0)
{
d[u[i]]=i;
earans[i]=earans[u[i]]+t[u[i]];
}
}
for(int i=1;i<=m;i++)
{
cout<<earans[i]<<" ";
if(earans[i]+t[i]>n+1)
{
flag=1;
}
}
cout<<endl;
if(flag==1)
{
return 0;
}
else
{
for(int i=1;i<=m;i++)
{
if(d[i]==0)
{
lasans[i]=n-t[i]+1;
}
if(d[i]!=0)
{
lasans[i]=n-t[d[i]]-t[i];//这里d需要初始化,不初始化会导致t溢出
}
}
for(int i=1;i<=m;i++)
{
cout<<lasans[i]<<" ";
}
cout<<endl;
return 0;
}
} // namespace std;
-
思考:
算法的设计就是一个将具体实例的解决思路抽象为通用解决方法的过程,遇到算法问题先举例子解决,再抽象