CSP-202212-2 训练计划

news/2024/10/24 12:26:36/

目录

一、题目

二、思路

三、C++代码如下 


一、题目

问题背景

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

问题描述

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

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

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

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

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

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

输入格式

从标准输入读入数据。

输入共三行。

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

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

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

输出格式

输出到标准输出中。

输出共一行或两行。

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

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

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

样例 1

输入

10 50 0 0 0 01 2 3 2 10

输出

  1. 1 1 1 1 1

  2. 10 9 8 9 1

说明

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

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

样例 2

输入

10 70 1 0 3 2 3 02 1 6 3 10 4 3

输出

1 3 1 7 4 7 1

说明

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

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

样例 3

输入

10 50 1 2 3 410 10 10 10 10

输出

1 11 21 31 41

子任务

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

全部的测试数据满足 0<n≤365 且 0<m≤100。

二、思路

类似于动态规划但更简单,仔细都题目我们可以发现几个注意事项:

1、只能是后面的以来前面的:

  • 计算最晚开始时间时要看有没有被别的科目依赖
  • 计算最早开始时间要看有没有依赖别的科目

2、存在一个科目被多个科目依赖:

  • 计算最晚开始时间时要比较出依赖该科目中的所有科目的最长耗时时间
  • 例如科目2耗时为3,科目4,5,6都依赖科目2,且耗时分别为3,4,5。
  • 而一共有10天来完成训练,那么科目2 的最晚开始时间要被耗时最久的科目6决定。

三、C++代码如下 

#include<iostream>
#include<vector>
using namespace std;int main() {int n,m;cin>>n>>m;vector<vector<int> > c(m+1,vector<int> (2) );vector<int> dp(m+1);vector<int> dp1(m+1);for(int i = 0; i<2; ++i) {for(int j = 1; j<=m; ++j) {cin>>c[j][i];}}dp[0] = 0;//设置一个flag来标记当前是否能完成复习任务bool flag = true;for(int i = 1; i<=m; ++i) {dp[i] = c[i][1];dp[i] += dp[c[i][0]];if(dp[i]>n) {flag = false;}}//计算最早开始时间for(int i = 1; i<=m; ++i) {cout << dp[c[i][0]]+1 << ' ';}//计算最晚开始时间for(int i = m; i>=1; --i) {dp1[i] += c[i][1];dp1[c[i][0]] = max(dp1[i],dp1[c[i][0]]); dp1[0] = 0; }if(flag) {cout << endl;for(int i = 1; i<=m; ++i) {cout << n - dp1[i] + 1<< ' ';}}return 0;
}


http://www.ppmy.cn/news/69199.html

相关文章

离散数学_九章:关系(3)

9.3 关系的表示 1、用集合表示关系2、用矩阵表示关系矩阵表示关系⭐集合上的关系矩阵 R 自反时 R 对称时 R 反对称时 ⭐确定关系合成的矩阵 3、用有向图表示关系有向图⭐从有向图中 确定关系具有的属性 自反性对称性反对称性传递性 本节及本章的剩余部分研究的所有关系均为二…

边缘网关协议(BGP)的演进与发展

边缘网关协议(Border Gateway Protocol&#xff0c;BGP)是一种用于在网络边缘传输路由信息的协议。它被广泛用于骨干网络和接入网络中&#xff0c;用于在网络边缘路由流量&#xff0c;并确保不同的网络之间具有最佳的路由路径。BGP是由RIP协议发展而来的&#xff0c;但在实现和…

Flink 常用API(2)——转换算子+聚合算子

转换算子&#xff08;Transformation&#xff09; 映射&#xff08;map&#xff09; 用于将数据流中的数据进行转换&#xff0c;形成新的数据流 “一一映射”&#xff0c;消费一个元素就产出一个元素 参数&#xff1a;接口 MapFunction 的实现 方法&#xff1a;map 返回值…

泼辣修图app下载2024最新版修图滤镜

泼辣修图专业版是一款强大的专业修图软件&#xff0c;拥有上百款调色工具还有丰富的图层素材&#xff0c; 更有智能的人像修饰面板&#xff0c;具备物体识别的智能蒙板&#xff0c;高效的滤镜管理系统和强大的文字工具&#xff0c;支持批量处理。一切围绕摄影&#xff0c;无论是…

【P1003 [NOIP2011 提高组] 铺地毯】

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n n n 张地毯&#xff0c;编号从 1 1 1 到 n n n。现在将这些地毯按照编号从小…

1110 Complete Binary Tree(超详细注解+31行代码)

分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each input file contains one test case. For each case, the first line gives a positive integer N …

完美解决:由于找不到MSVR100.dll ,无法继续执行代码

当我们在运行某一个软件时&#xff0c;突然提示找不到MSVCR100.dll&#xff0c;我相信有不少用户都遇到过这种情况&#xff0c;并且在重新安装软件后还是无法解决。那么电脑提示找不到MSVCR100.dll该怎办呢? MSVCR100.dll是什么&#xff1f; 在解决找不到MSVCR100.dll这个问…

Django SQL注入漏洞 CVE-2022-28346

漏洞简介 Django 在2022年发布的安全更新&#xff0c;修复了在 QuerySet 的 annotate()&#xff0c; aggregate()&#xff0c; extra() 等函数中存在的 SQL 注入漏洞。 影响版本 2.2< Django Django <2.2.283.2< Django Django <3.2.134.0< Django Django <4…