CCF刷题计划——训练计划(反向拓扑排序)

news/2024/9/18 11:05:18/ 标签: 算法, ccf, c++, 拓扑, 数据结构

训练计划

计算机软件能力认证考试系统

这道题70分还是很好拿的。后面30分需要用到 反向拓扑排序 ,相对而言就麻烦点,需要逆序遍历。不着急,我们慢慢来。首先给出70分的代码。

本题可以学到:反向拓扑排序

70分题解:

#include <iostream>
#include <vector>
using namespace std;
const int N=366;
//如果只考虑70%,都不能满足,被依赖者越早发生越好。
//剩下的30%,应该是无依赖,和依赖也能完成,被依赖者可以适当延后
//我们可以先按照越早发生的情况把相应的算出来,并记录好这条链。然后从最晚发生的开始,向上增加天数。
//但是问题在于,这只能改这一条上的数据。如果有链和其相交,交点位置改变,会影响支链的情况。
//好吧,那就先只弄70分的吧 int n,m;	//距离大赛开幕的天数 训练科目的数量
vector<int>depend(N);	//依赖情况 
vector<int>cost(N);	//消耗天数 int main()
{cin>>n>>m; for(int i=1;i<=m;i++)	cin>>depend[i];for(int i=1;i<=m;i++)	cin>>cost[i];for(int i=1;i<=m;i++){if(depend[i]==0)	cout<<1<<" ";else{int t=depend[i];int sum=0;while(t!=0){sum+=cost[t];t=depend[t];} cout<<1+sum<<" ";}}return 0;
}

计算最晚开始时间latest 数组)的逻辑是基于课程的依赖关系,通过反向遍历所有课程来实现的。这种方法通常称为“反向拓扑排序”或“逆后序遍历”,因为它从没有任何依赖(即出度为0)的课程开始,然后逐步向前追溯到有依赖关系的课程。

  1. 初始化

    • 对于所有课程,最晚开始时间(latest 数组)的初始值可以设置为一个足够大的数(比如INT_MAX),但在这个代码中,由于已经知道总时间限制为n天,并且每个课程都需要一定的时间来完成,所以更合理的初始化方式是针对没有依赖的课程(即入度为0的课程),将其最晚开始时间设置为n - cost[i] + 1,这里cost[i]是课程i所需的训练天数。

  2. 反向遍历

    m(最后一个课程的编号)开始,递减遍历到1(第一个课程的编号)。

    对于每个课程i

    • 如果课程i没有依赖(即mp[i].size() == 0),则直接根据总时间限制和该课程的训练天数来设置其最晚开始时间:latest[i] = n - cost[i] + 1。这是因为没有任何课程依赖于课程i,所以课程i可以在不迟于n - cost[i] + 1天开始,以确保在n天内完成。

    • 如果课程i有依赖(即mp[i].size() > 0),则需要找到所有依赖于课程i的课程(即mp[i]中的课程)的最晚开始时间中的最小值,然后从这个最小值中减去课程i的训练天数来得到课程i的最晚开始时间。这是因为课程i必须在其所有依赖课程之后开始,以确保在它们完成之后才能开始课程i我在代码中举了例子,大家可以看看。

  3. 计算过程

    • 在计算过程中,由于是从后向前遍历,所以当一个课程的最晚开始时间被计算出来时,它的所有依赖课程的最晚开始时间都已经被计算过了。这使得我们能够正确地找到依赖课程中的最晚开始时间的最小值。

    AC:

#include <iostream>
#include <map>
#include <vector>
using namespace std;int n,m;
map<int,vector<int>>mp;			// <科目i,<依赖于i的科目集合>> 
bool f=false;					//判断是否能在规定时间内训练完 int main()
{cin >>n>>m;vector<int> depend(m + 1);		//科目i所依赖的科目depend[i]vector<int> cost(m + 1);		//科目i所需的训练天数	vector<int> earlist(m + 1);		//科目i最早开始时间vector<int> latest(m + 1);		//科目i最晚开始时间for (int i = 1; i <= m; i++) {cin >> depend[i];mp[depend[i]].push_back(i);}for (int i = 1; i <= m; i++)	cin >> cost[i];for (int i = 1; i <= m; i++) {if (depend[i] == 0)earlist[i] = 1;else {int k = depend[i];earlist[i] = earlist[k] + cost[k];if (earlist[i] + cost[i] > n)f = true;	//表示不能在规定时间内做完}cout << earlist[i] << " ";}if (f) 	//不能做完,那就到此为止 return 0;//能在规定时间内做完,继续输出最晚开始时间 cout<<endl;for (int i = m; i >= 1; i--) {if (mp[i].size() == 0) latest[i] = n - cost[i] + 1;else {int min_num = latest[mp[i][0]];	
//所有依赖课程的最晚开始时间中的最小值,也就是最先完成的依赖课程for (int j = 0; j < mp[i].size(); j++) {if (latest[mp[i][j]] < min_num)min_num = latest[mp[i][j]];}latest[i] = min_num - cost[i];	/*当前课程的最晚开始时间不是由他决定的,而是由他的依赖课程决定的。
后续依赖课程都满足贴屁股完成,在此前提下,越早开始的,其最晚开始时间越小。
我们就是要满足这个最小时间,才能确定当前课程i的最晚开始时间。比如有2、3都依赖1。现在我们想确定1的最晚开始时间。
已知2的最晚开始时间是5,到10结束;3的最晚开始时间是7,到10结束;cost[1]=1。
按照上述方法,我们应该选择5作为min_num,然后计算latest[1]=5-cost[1]=4,作为1的最晚开始时间。
如果我们选择7,latest[1]=7-cost[1]=6。
然后我们发现,2的最晚开始时间是5,1的最晚开始时间是6,但是2又依赖于1,1本应该比2先开始。
所以出现矛盾。*/}}for (int i = 1; i <= m; i++)	cout << latest[i] << " ";	return 0;
}

参考代码:【CCF CSP】202212-2 训练计划-CSDN博客


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

相关文章

红黑树的删除

文章目录 前言一.删除的节点左子树右子树都有二.删除的节点只有左/右子树删除调整操作 三.删除的节点没有孩子1.删除的节点为红色2.删除的节点为黑色1).兄弟节点为黑色(1).兄弟节点至少有一个红色的孩子节点LL型RR型RL型LR型 (2).兄弟节点没有孩子或所有孩子为黑色 2).兄弟节点…

【贪心算法】贪心算法

贪心算法简介 1.什么是贪心算法2.贪心算法的特点3.学习贪心的方向 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.什么是贪心算法 与其说是…

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中&#xff0c;不同电脑的配置和操作系统&#xff08;如Win11与Win7&#xff09;可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行&#xff0c;需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下&a…

Integer 缓存

在 Java 中&#xff0c;如果你通过 new Integer(value) 显式创建一个 Integer 对象&#xff0c;以下几点需要注意&#xff1a; 内存中的 Integer 对象 缓存范围&#xff1a; Java 自动缓存的 Integer 对象范围是从 -128 到 127。这些对象在类加载时被创建并存储在内存中。 使…

服务网关工作原理,如何获取用户真实IP?

文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器&#xff08;案例&#xff1a;获取用户真实IP地址&#xff09; (★) 补充1&#xff1a;不同类型的客户端如何设…

使用@test-library/react的screen中的方法和直接使用getByText,getByTestId等的区别?

在 React Testing Library 中&#xff0c;screen 对象和直接使用 getByText, getByTestId 等方法之间的主要区别在于它们的使用方式和上下文。然而&#xff0c;从功能的角度来看&#xff0c;它们实际上是相互关联的&#xff0c;因为 screen 对象提供了一组封装好的查询方法&…

2024非常全的接口测试面试题及参考答案

一、前言 接口测试最近几年被炒的火热了&#xff0c;越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢&#xff1f; 主要是平常的功能点点点&#xff0c;大家水平都一样&#xff0c;是个人都能点&#xff0c;面试时候如果问你平常在公司怎么测试的&…

11Python的Pandas:可视化

Pandas本身并没有直接的可视化功能&#xff0c;但它与其他Python库&#xff08;如Matplotlib和Seaborn&#xff09;无缝集成&#xff0c;允许你快速创建各种图表和可视化。这里是一些使用Pandas数据进行可视化的常见方法&#xff1a; 1. 使用Matplotlib Pandas中的plot()方法…

架构设计 - 常用日志收集方案选型对比与推荐

目录 1. 常用组合1.1 ELK Stack -> Elastic Stack1.2 EFK Stack1.3 Graylog1.4 PLG 日志系统1.5 Splunk1.6 Filebeat ELK1.7 AWS CloudWatch Logs1.8 阿里云日志服务1.9 腾讯云 CLS&#xff08;日志服务&#xff09; 2. 推荐 日志收集是系统监控和调试中的关键环节。常见的…

彩漩科技亮相企业出海峰会,展示智能办公新力量

近日&#xff0c;在北京市海淀区商务局的指导下&#xff0c;由中关村东升科技园联合创新企业科普联盟共同举办的企业出海峰会于北京成功举办。本次峰会以“出海新征程&#xff0c;企业新高度”为核心议题&#xff0c;深入探讨全球化背景下科技企业出海面临的机遇与挑战。通过汇…

Linux常用命令笔记

执行查看帮助命令 1.1 Linux命令的格式 命令名称 [命令参数] [命令对象] 命令名称、命令参数、命令对象之间请用空格键分隔命令对象一般是指要处理的文件、目录、用户等资源&#xff0c;而命令参数可以用长格式&#xff08;完整的选项名称&#xff09;&#xff0c;也可以用短…

95、k8s之rancher可视化

一、ranker 图形化界面 图形化界面进行k8s集群的管理 rancher自带监控----普罗米修斯 [rootmaster01 opt]# docker load -i rancher.tar ##所有节点 [rootmaster01 opt]# docker pull rancher/rancher:v2.5.7 ##主节点[rootmaster01 opt]# vim /etc/docker/daemon.jso…

浅谈WebApi

一、基本介绍 Web API&#xff08;Web应用程序编程接口&#xff09;是一种用于构建应用程序的接口&#xff0c;它允许软件应用程序通过HTTP请求与Web服务器进行交互。Web API通常用于构建客户端-服务器应用程序&#xff0c;其中客户端可以是Web浏览器、移动应用程序、桌面应用程…

【大数据】MapReduce的“内存增强版”——Spark

【大数据】MapReduce的“内存增强版”——Spark 文章脉络 Spark架构 Spark-core SparkConf 和 SparkContext RDD Spark集群 Spark-sql 在大数据时代&#xff0c;数据处理和分析成为企业竞争的重要手段。Hadoop作为大数据处理的基石&#xff0c;其核心组件MapReduce在众多…

基于微信小程序+Java+SSM+Vue+MySQL的宿舍管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSSMVueMySQL的宿舍管理系统【附源码文档…

Python中的单例模式:从入门到精通

引言 单例模式是一种常用的软件设计模式&#xff0c;它保证了一个类只有一个实例&#xff0c;并提供一个全局访问点。这种模式通常用于那些需要频繁创建和销毁的对象&#xff0c;比如日志对象、线程池、缓存等场景&#xff0c;可以有效减少资源消耗&#xff0c;提高系统性能。…

1-4微信小程序基础

模板配置 &#x1f32e;&#x1f32e;目标 1.能够使用WXML模板语法渲染页面结构2.能够使用WXSS样式渲染标签样式3.能够使用app.json对小程序进行全局配置4.能够使用page.json对小程序页面进行个性化配置5.如何发起网络数据请求 数据绑定的基本原则 在data中定义数据在WXML中…

springboot后端开发-常见注解及其用途

文章目录 1. 组件注解2. 依赖注入注解3. 配置类注解4. 测试注解5. 控制器注解6. 安全和认证注解7. 切面相关注解8. API文档相关注解(需引入swagger)9. 其他注解 在Spring Boot框架中&#xff0c;有许多常用的注解用来简化开发过程中的依赖注入、组件扫描、配置、安全控制等方面…

部署Vue项目到Nginx上,来练一下手吧

部署Vue项目到Nginx上主要涉及几个步骤&#xff1a;构建Vue项目、配置Nginx服务器以及启动Nginx服务。以下是一个基本的流程&#xff1a; 1. 构建Vue项目 首先&#xff0c;你需要在本地或开发环境中构建你的Vue项目。这通常通过运行Vue CLI提供的构建命令来完成。 打开你的V…

Open-Sora代码详细解读(2):时空3D VAE

Diffusion Models视频生成 前言&#xff1a;目前开源的DiT视频生成模型不是很多&#xff0c;Open-Sora是开发者生态最好的一个&#xff0c;涵盖了DiT、时空DiT、3D VAE、Rectified Flow、因果卷积等Diffusion视频生成的经典知识点。本篇博客从Open-Sora的代码出发&#xff0c;深…