CSP 202212-2 训练计划 C/C++满分题解

解题思路:

1.最早开始时间:判断是否有依赖科目,有的话,依赖科目完成时间的下一天就是该科目最早开始时间。否则,第一天就是最早开始时间。

2.最晚开始时间:从后往前判断,根据当前科目计算出依赖的科目的最晚开始时间,如果有多科目依赖某一科目,要进行比较,选出最早的最晚开始时间

#include<bits/stdc++.h>
using namespace std;

int depend[105];  //记录每个科目的依赖科目编号 
int last[400];    //最晚开始天数 
int first[400];  //最早开始时间 
int days[400];   //每个科目需要的时间 

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>depend[i];
	}
	
	for(int i=1;i<=m;i++)  cin>>days[i];
	
	int flag=0;  //用于标记是否有科目没法在规定时间内完成 
	for(int i=1;i<=m;i++)
	{
		if(depend[i]==0)  first[i]=1;
		else
		{
			first[i]=first[depend[i]]+days[depend[i]];  //如果有依赖科目,注意边界的判断
		}
		if(first[i]+days[i]-1>n)  flag=1;	//该科目没有在规定时间内完成	
	}
	for(int i=1;i<=m;i++)  cout<<first[i]<<' ';
	
	if(flag==0)   //所有科目都能完成,根据当前科目计算依赖的科目的最晚开始时间
	{
		cout<<endl;
		for(int i=m;i>=0;i--)  //从后往前计算
		{
			if(depend[i]!=0)  //有依赖的科目 
			{
				int t=depend[i];   //依赖科目编号
				int lt=n-days[i]+1;   //当前科目最晚开始时间的可能取值
				if(last[i]==0)  last[i]=lt;   //如果之前没有计算出最晚开始时间,则使用该最晚开始时间
				else
				{
					if(last[t]>lt)  last[t]=lt;  //否则,要与之前计算出的最晚开始时间进行判断
				}
				int tt=last[i]-days[t];   //对于依赖的科目也是同理
				if(last[t]==0)  last[t]=tt;
				else
				{
					if(last[t]>tt)
					{
						last[t]=tt;
					}
				}
			}
			else  //没有依赖科目
			{
				int t=n-days[i]+1;
				if(last[i]==0)  last[i]=t;  //也要进行判断
				else
				{
					if(t<last[i])  last[i]=t;
				}
			}
		}
		
		for(int i=1;i<=m;i++)  cout<<last[i]<<' ';
	}
	return 0; 
}

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小瑾比个耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值