CCF202212-2 训练计划

文章描述了一种求解训练计划的问题,其中涉及科目之间的依赖关系和时间限制。顿顿需要在n天内完成m项科目的训练,每项科目有特定的训练天数和依赖科目。算法需要找出每项科目的最早和最晚开始时间,确保所有训练能在限定时间内完成。对于无法在规定时间内完成的情况,只需计算最早开始时间。
摘要由CSDN通过智能技术生成

问题背景

西西艾弗岛荒野求生大赛还有 n 天开幕!

问题描述

 为了在大赛中取得好成绩,顿顿准备在 n 天时间内完成“短跑”、“高中物理”以及“核裂变技术”等总共 m 项科目的加强训练。其中第 i 项(1≤i≤m)科目编号为 i,也可简称为科目 i。已知科目 i 耗时ti天,即如果从第 a 天开始训练科目 i,那么第a+ti-1天就是该项训练的最后一天。

大部分科目的训练可以同时进行,即顿顿在同一天内可以同时进行多项科目的训练,但部分科目之间也存在着依赖关系。如果科目 i 依赖科目 j,那么只能在后者训练结束后,科目 i 才能开始训练。具体来说,如果科目 j 从第 a 天训练到第 天,那么科目 i 最早只能从第 天开始训练。还好,顿顿需要训练的 m 项科目依赖关系并不复杂,每项科目最多只依赖一项别的科目,且满足依赖科目的编号小于自己。那些没有任何依赖的科目,则可以从第 1 天就开始训练。

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

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

2)最晚开始时间:在不耽误参赛的前提下(n 天内完成所有训练),该科目最晚可以从哪一天开始训练?

n 天内完成所有训练,即每一项科目训练的最后一天都要满足 ≤n。需要注意,顿顿如果不能在 n 天内完成全部 m 项科目的训练,就无法参加大赛。这种情况下也就不需要再计算“最晚开始时间”了。

输入格式

从标准输入读入数据。

输入共三行。

输入的第一行包含空格分隔的两个正整数 n 和 m,分别表示距离大赛开幕的天数和训练科目的数量。

输入的第二行包含空格分隔的 m 个整数,其中第i个(1≤i≤m)整数Pi表示科目 i 依赖的科目编号,满足 0≤Pi<i; Pi=0 表示科目 i 无依赖。

输入的第三行包含空格分隔的 m 个正整数,其中第 i 个(1≤i≤m)数 ti表示训练科目 i 所需天数,满足 1≤ti≤n。

输出格式

输出到标准输出中。

输出共一行或两行。

输出的第一行包含空格分隔的 m 个正整数,依次表示每项科目的最早开始时间。

如果顿顿可以在 n 天内完成全部 m 项科目的训练,则继续输出第二行,否则输出到此为止。

输出的第二行包含空格分隔的 m 个正整数,依次表示每项科目的最晚开始时间。

样例 1 输入

10 5
0 0 0 0 0
1 2 3 2 10

样例 1 输出

1 1 1 1 1
10 9 8 9 1

样例 1 说明

五项科目间没有依赖关系,都可以从第1天就开始训练。

10天时间恰好可以完成所有科目的训练。其中科目1耗时仅1天,所以最晚可以拖延到第10天再开始训练;而科目5耗时10天,必须从第1天就开始训练。

样例 2 输入

10 7
0 1 0 3 2 3 0
2 1 6 3 10 4 3

样例 2 输出

1 3 1 7 4 7 1

样例 2 说明

七项科目间的依赖关系如图所示,其中仅科目5无法在10天内完成训练。

具体来说,科目5 依赖科目2 、科目2又依赖于科目1 ,因此科目5最早可以从第4天开始训练。

样例 3 输入

10 5
0 1 2 3 4
10 10 10 10 10

样例 3 输出

1 11 21 31 41

子任务

70%的测试数据满足:顿顿无法在n天内完成全部m项科目的训练,此时仅需输出一行“最早开始时间”;全部的测试数据满足0<n≤365且 0<m≤100。

思路

对于该题给出的子任务而言可以看出该题分为70分和100分。

70分

因为每一个科目都只会与前面的科目产生依赖,所以对于最早开始时间而言,我们只需要考虑在当前科目下,它是否与前面的科目产生了依赖。

如果未产生依赖,也就是当前Pi=0,这样可以该科目的最早开始时间即为1。

如果产生依赖,则就是需要在依赖的科目所需要的天数上加1,并且防止出现多个科目连续依赖,需要对当前科目所需要的天数加上他所依赖的科目的天数。

100分

对于最晚开始时间而言需要先对其进行判断,看看能不能输出最晚开始时间。即按照70分的那个科目所需天数累加而言,如果其累加科目大于所需要的天数即为不能输出最晚开始时间。

若能输出最晚开始时间,则相比较于最早开始时间而言,最晚开始时间是从最后一个科目往前看,若前面没有与之产生依赖的科目,则可对当前科目所需的天数进行存储。若前面有与其产生依赖的科目,在此可以创建一个初始数据为0的数组,对当前的科目所需要的天数进行存储,同时对前面所需要的科目进行调整(也就是说前面与之产生以来的科目所需要的天数加上当前科目所需要的天数,)。同时如果出现多个科目对一个科目的依赖性,则需要判断这些科目中所需要的天数的最大值(在此举个例子帮助理解,假如科目3需要的天数是3天,科目4和科目5所需要的天数分别为4天和5天,且两者都对科目3产生依赖。那么这个时候科目3的最晚开始时间就要以科目5所需要的时间作为参考)

100分代码

其中在70分代码的时候对原始数组t中的内容进行了更改,所以在100分代码的过程中又建立了一个数组t2,其中t1数组是为了存储每个科目中按照最晚开始时间来算所需要的天数

总结

这是我第一次写这种题解,有时候脑子中知道怎么做,但是写出来可能就不那么流畅了,因此也是希望看的人见谅,我也会在一次次中成长自己,争取下一次做到更好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hard.hard

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

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

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

打赏作者

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

抵扣说明:

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

余额充值