csp 2022—12 训练计划 70分代码

马上要考csp——23-3了,暂时先更70分

问题背景

西西艾弗岛荒野求生大赛还有

天开幕!

问题描述

为了在大赛中取得好成绩,顿顿准备在

天时间内完成“短跑”、“高中物理”以及“核裂变技术”等总共 项科目的加强训练。其中第 项()科目编号为 ,也可简称为科目 。已知科目 耗时 天,即如果从第 天开始训练科目 ,那么第

天就是该项训练的最后一天。

大部分科目的训练可以同时进行,即顿顿在同一天内可以同时进行多项科目的训练,但部分科目之间也存在着依赖关系。如果科目

依赖科目 ,那么只能在后者训练结束后,科目 才能开始训练。具体来说,如果科目 从第 天训练到第 天,那么科目 最早只能从第 天开始训练。还好,顿顿需要训练的 项科目依赖关系并不复杂,每项科目最多只依赖一项别的科目,且满足依赖科目的编号小于自己。那些没有任何依赖的科目,则可以从第

天就开始训练。

对于每一项科目,试计算:

1)最早开始时间:该科目最早可以于哪一天开始训练?

2)最晚开始时间:在不耽误参赛的前提下(

天内完成所有训练),该科目最晚可以从哪一天开始训练?

天内完成所有训练,即每一项科目训练的最后一天都要满足 。需要注意,顿顿如果不能在 天内完成全部

项科目的训练,就无法参加大赛。这种情况下也就不需要再计算“最晚开始时间”了。

输入格式

从标准输入读入数据。

输入共三行。

输入的第一行包含空格分隔的两个正整数

,分别表示距离大赛开幕的天数和训练科目的数量。

输入的第二行包含空格分隔的

个整数,其中第 个()整数 表示科目 依赖的科目编号,满足 ; 表示科目

无依赖。

输入的第三行包含空格分隔的

个正整数,其中第 个()数 表示训练科目 所需天数,满足

输出格式

输出到标准输出中。

输出共一行或两行。

输出的第一行包含空格分隔的

个正整数,依次表示每项科目的最早开始时间。

如果顿顿可以在

天内完成全部

项科目的训练,则继续输出第二行,否则输出到此为止。

输出的第二行包含空格分隔的

个正整数,依次表示每项科目的最晚开始时间。

 

#include<bits/stdc++.h>
using namespace std;
int t[365];//记录每个所耗的时间 
int p[100];//记录前驱结点下标 
int e[365];//early time 
int l[165];//late time
int n,m;

int  f(int i)
{
	    
		if(p[i]==0) return 0;//无前驱节点 
		if(p[i]!=0)//有前驱节点 
		{
			return t[p[i]]+f(p[i]);//加前驱的time,递归下一层 
		}	
	
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>p[i];
	}
	for(int i=1;i<=m;i++)
	{
		cin>>t[i];
	}
	for(int i=1;i<=m;i++)
	{
		if(p[i]==0)
		{
			e[i]=1;//判断是不是无前驱 
		} 
		else
		{  //有前驱的话,进入设置的函数 
			e[i]=f(i)+1;//对比案例,可以看出最后要加一 
		}
	}
	for(int i=1;i<=m;i++)
	{
		cout<<e[i]<<" ";
	}

	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值