CSP202212-2 训练计划

这篇具有很好参考价值的文章主要介绍了CSP202212-2 训练计划。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题背景

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

问题描述

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

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

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

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

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

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

输入格式

从标准输入读入数据。

输入共三行。

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

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

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

输出格式

输出到标准输出中。

输出共一行或两行。

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

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

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

样例 1

输入
10 5
0 0 0 0 0
1 2 3 2 10
输出
1 1 1 1 1
10 9 8 9 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
输出
1 3 1 7 4 7 1
说明

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

CSP202212-2 训练计划

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

样例 3

输入
10 5
0 1 2 3 4
10 10 10 10 10
输出
1 11 21 31 41

子任务

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

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


思路

最早开始时间和依赖关系有关,若某科目无依赖(即CSP202212-2 训练计划=0 ),则第一天就可以开始;若科目i依赖于科目j,且科目j无依赖,则科目i等科目j做完即可开始;若科目j也依赖于科目k,则科目i要等科目k,科目j做完才开始,以此类推......

for (int i = 1; i <= m; i++) {
        if (p[i] == 0)
            cout << 1 << " ";
        else {
            cout << q[p[i]] + 1 << " ";
            q[i] += q[p[i]] ;
        }            
    }

由题干:70% 的测试数据满足:顿顿无法在 n 天内完成全部 m 项科目的训练,此时仅需输出一行“最早开始时间”可知,得70分只用输出一行--最早开始时间。

70分代码

#include <iostream>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    int p[105] = {0};
    int q[105] = {0};
    for (int i = 1; i <= m; i++) {
        cin >> p[i];
    }
    for (int i = 1; i <= m; i++) {
        cin >> q[i];
    }
    for (int i = 1; i <= m; i++) {
        if (p[i] == 0)
            cout << 1 << " ";
        else {
            cout << q[p[i]] + 1 << " ";
            q[i] += q[p[i]] ;
        }            
    }
    return 0;
}

下面来看100分的思路,加上了最晚开始时间。

假设能在n天内完成所有训练,则最晚开始时间应是自己本身加上后面与自己有依赖关系的训练的时间之和t0,t=n-t0+1.

当然,与自己有依赖的可能不止一个,所以应该是自己与一个有依赖的训练的时间之和的最大值,即为t0,可求得最晚的开始时间。

明白上述后,来判断什么条件下需要输出第二行,我们定义一个判断的bool类型的变量flag,若某训练本身需的时间加上在自身前需优先完成的训练的时间之和大于了n,则说明不能按时完成所以训练,即不输出第二行。

if (q[p[i]]  + q[i] > n)
    flag = 1;
q[i] += q[p[i]] ; //多重依赖关系的累加

考虑到解决第一个问题改动了q[]数组,故新开一个q1[]数组,来供第二个问题。

若判断得出能完成所以训练,则来求出一组有依赖关系训练所需最大总时间:

  • 从后往前循环,先让r数组加上自己所需时间

  • 判断是否有优先完成的训练(即p[i]是否为0),若不为0,则让前面需优先完成的训练r[p[i]]加上自己的时间r[i](由于前面的训练可能不止一个依赖关系的训练,故取最大值max)

if (p[i])
  r[p[i]] = max(r[i], r[p[i]]);

以此反复,越往前,后面的训练对前面的影响就统计进去,前面r数组就考虑了后面有依赖关系的训练,求出了一系列训练的最大总时间。

然后最晚开始时间就是准备时间n减去总时间r[i]加上1,即n-r[i]+1;

100分代码

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    int p[105] = {0};
    int q[105] = {0};
    int q1[105] = {0};
    int r[105] = {0};
    bool flag = 0;
    for (int i = 1; i <= m; i++) {
        cin >> p[i];
    }
    for (int i = 1; i <= m; i++) {
        cin >> q[i];
        q1[i] = q[i];
    }
    for (int i = 1; i <= m; i++) {
        if (p[i] == 0)
            cout << 1 << " ";
        else {
            cout << q[p[i]] + 1 << " ";
            if (q[p[i]]  + q[i] > n)
                flag = 1;
            q[i] += q[p[i]] ;
        }            
    }
    if (!flag) {
        cout << endl;
        for (int i = m; i >= 1; i--) {
            r[i] += q1[i];
            if (p[i])
                r[p[i]] = max(r[i], r[p[i]]);
        }
        for (int i = 1; i <= m; i++) {
            r[i] = n - r[i] + 1;
            cout << r[i]<<" ";
        }
    }
    return 0;
}

结尾

作为CSP第二题难度有些提升,但拿70分还是比较简单的,100分的解法由于实力不济,尚在学习,也想了一久,最后写出了我认为比较简单容易理解的做法,如有问题,还望包涵,欢迎指出。文章来源地址https://www.toymoban.com/news/detail-401959.html

到了这里,关于CSP202212-2 训练计划的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CCF- CSP 202303-2垦田计划 【多种方法】满分题解

    CCF- CSP 202303-2垦田计划 【多种方法】满分题解 题目链接:CCF- CSP 202303-2垦田计划 70分思路: 从基础耗时最长的区域进行筛选,每次基础耗时减少一天 该方法以 m 作为参考对象,对 m 进行减的操作( m 的数据范围达到 1e9 ,导致超时) 采用 优先队列 作为存储结构,同时存储 t 和

    2024年02月01日
    浏览(84)
  • CCF-CSP 29次 第二题【202303-2 垦田计划】

    法一: 70分:优先队列 对基础耗时大的优先进行处理 法二: 100分:二分答案 法三:对法一的改进 100分:对相同耗时的区域合并处理 同样从耗时最多的区域开始

    2024年02月07日
    浏览(49)
  • 2023CSP-CCF前三题 田地丈量、垦田计划、LDAP解题分析

    2023.03第29次CCF-CSP计算机认证考试 CCF计算机软件能力认证考试系统 大二菜鸟第一次参加CSP考试,发挥得很烂( 其实是实力太菜了 ),考前也没看往年题目套路,有很多不甘吧,不过拟打算六月再参加一次。如果早知道题目难度是依次递增的,就不写完两题就去啃最后一题了

    2024年02月05日
    浏览(42)
  • CCF-CSP真题《202303-2 垦田计划》思路+python,c++满分题解

    想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号: 202303-2 试题名称: 垦田计划 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 顿顿总共选中了 n 块区域准备开垦田地,由于各块区域大小不一,开垦所需时间也不尽相同。据估算,其中第 i 块

    2024年02月12日
    浏览(67)
  • 【Ctfer训练计划】——(四)

    作者名:Demo不是emo  主页面链接:主页传送门 创作初心: 一切为了她 座右铭: 不要让时代的悲哀成为你的悲哀 专研方向: 网络安全,系统安全 每日emo: 在学习的过程中迷失生活 目录 一、mdb文件泄露 二、 tomcat 认证爆破 题目 :web15 训练平台 :ctfshow 题目描述 : mdb文件

    2023年04月16日
    浏览(72)
  • 【Ctfer训练计划】——(六)

    作者名:Demo不是emo  主页面链接:主页传送门 创作初心: 一切为了她 座右铭: 不要让时代的悲哀成为你的悲哀 专研方向: web安全,后渗透技术 每日emo: 别来我梦里了,我已负担不起醒来的失落 题目 :web25 训练平台 :ctfshow 题目描述 : 爆个 🔨 ,不爆了 开启容器页面如

    2024年01月17日
    浏览(36)
  • GAN的训练技巧:炼丹师养成计划 ——生成式对抗网络训练、调参和改进

    生成对抗网络(GAN:Generative adversarial networks)是深度学习领域的一个重要生成模型,即两个网络(生成器和鉴别器)在同一时间训练并且在极小化极大算法(minimax)中进行竞争。这种对抗方式避免了一些传统生成模型在实际应用中的一些困难,巧妙地通过对抗学习来近似一些

    2023年04月08日
    浏览(38)
  • 【Ctfer训练计划】——命令执行的解题技巧(持续更新中)

    作者名:Demo不是emo  主页面链接: 主页传送门 创作初心: 一切为了她 座右铭: 不要让时代的悲哀成为你的悲哀 专研方向: web安全,后渗透技术 每日emo: 真的还有相见的机会吗   目录 一、绕过  1、cat限制绕过 2、$限制绕过 3、点号限制绕过(2023.1.4) 4、空格限制绕

    2024年02月03日
    浏览(31)
  • 【剑指offer|图解|链表】删除链表的节点 + 训练计划 V

    🏠 个人主页:@聆风吟的个人主页 🔥系列专栏:本期文章收录在专栏《剑指offer每日一练》中,大家有兴趣可以浏览和关注,后面将会持续更新更多精彩内容! ⏰寄语:少年有梦不应止于心动,更要付诸行动。 🎉欢迎大家关注🔍点赞👍收藏⭐️评论📝 🌈作者留言:文章

    2024年02月08日
    浏览(49)
  • 青少年软件编程C++一级真题(202212)

    1、输入一个整数x,输出这个整数加1后的值,即x+1的值。 时间限制:1000 内存限制:65536 输入 一个整数x(0 ≤ x ≤ 1000)。 输出 按题目要求输出一个整数。 样例输入 样例输出 2、给定整数a、b、c,计算(a / b)*c的值,这里的除法为实数除法。 时间限制:1000 内存限制:65536 输

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包