CCF CSP202212-2 训练计划

题目

 测试满分

 代码示例

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n,m;
    cin >> n >> m;
    int rel[m+1];
    int need_day[m+1];
    for(int i=1; i<=m; i++)
    {
        cin >> rel[i];
    }
    for(int i=1; i<=m; i++)
    {
        cin >> need_day[i];
    }
    int early_time[m+1];
    int dead_time[m+1];
    for(int i=0; i<=m; i++)
    {
        early_time[i]=1;
        dead_time[i]=n;
    }
    //计算最早时间
    for(int i=1; i<=m; i++)
    {
        if(rel[i]==0)
        {
            early_time[i]=1;
        }
        else
        {
            early_time[i]=early_time[rel[i]]+need_day[rel[i]];
        }
    }
    //计算最晚开始时间
    for(int i=m; i>0; i--)
    {
            dead_time[i]=min(n-need_day[i]+1,dead_time[i]);
            dead_time[rel[i]]=min(dead_time[i]-need_day[rel[i]],dead_time[rel[i]]);
    }
    int tag=1;
    for(int i=1; i<=m; i++)
    {
        if(dead_time[i]<=0)
        {
            tag=0;
            break;
        }
    }
    for(int j=1; j<=m; j++)
    {
        cout << early_time[j] << "  ";
    }
    if(tag)
    {
        cout<<endl;
        for(int j=1; j<=m; j++)
        {
            cout << dead_time[j] << "  ";
        }
    }
    return 0;
}

思路

说一下思路吧,其实刚开始我想复杂了,我以为他们之间的依存关系是复杂的,比如像1<—3<—2 这种,那其实用顺序遍历的时候遍历到了比前面的依存数小的时候,就需要调整到最开始的不存在依存关系的那个点,这时我想到了用递归的方法,因为递归的本质就是栈啦,但是后来我看见了文中最关键的一句话:“每个科目最多只依赖一项别的项目,且满足依赖科目的编号小于自己”,那这句话就让题目变得简单了,在求最早开始时间的时候,只要依次把编号小的确定了就好了,编号大的只不过是在小的上面有所参考罢了。同样在算最晚开始时间的时候,采用从后往前的思路,把编号大的确定,编号小的就依次往后挪动时间就好了。

下面说说求最早开始时间和最晚开始时间的思路吧。

1、最早开始时间

//计算最早时间
    for(int i=1; i<=m; i++)
    {
        if(rel[i]==0)
        {
            early_time[i]=1;
        }
        else
        {
            early_time[i]=early_time[rel[i]]+need_day[rel[i]];
        }
    }

计算最早开始时间的话,如果该科目不存在依赖科目,那就直接最早从第一天就可以开始了,如果存在依赖科目的话,那就要以依赖科目的最早开始时间为基线,加上依赖科目完成所需时间,那么就是这个科目的最早开始时间了。

2、最晚开始时间

//计算最晚开始时间
    for(int i=m; i>0; i--)
    {
            dead_time[i]=min(n-need_day[i]+1,dead_time[i]);
            dead_time[rel[i]]=min(dead_time[i]-need_day[rel[i]],dead_time[rel[i]]);
    }

计算最晚开始时间的话,最晚时间不能超过最后一天,所以我们以最后一天为基线,从编号大的开始计算他的最晚开始时间,这个时候就涉及到了两个问题:(1)当该科目已经被其他科目依赖的时候 ,我们在计算它的最晚开始时间的时候就需要有一个最小值的比较,比较它在别人的约束条件下的时间和自己本身的约束时间那个更小。(2)当一个科目同时被多个科目依赖的时候,我们需要取比较小的时间作为最晚开始时间。这个时候,有可能某些科目的最晚开始时间已经小于0了,就说明无法完成训练任务,这也是我们控制输出几行的标准了。

总结

总结就是这次的第二题比以往的简单些啦,如果把“每个科目最多只依赖一项别的项目,且满足依赖科目的编号小于自己”这两句随便改一下,比如“每个科目可依赖多个项目”或是“依赖科目的编号不一定小于自己”,亦或者是两个条件也要满足,那这个题就难了,可以作为csp的第四题的难度了。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和引用\[3\]的信息,我们可以得知顿顿需要在n天时间内完成m项科目的加强训练。每项科目有一个编号,编号为i,其中1≤i≤m。每项科目的训练时间为ti天,即从第a天开始训练科目i,训练将持续到第a+ti−1天。科目之间存在依赖关系,如果科目i依赖科目j,那么只能在科目j训练结束后,科目i才能开始训练。 对于csp202212-2题目中的c++训练计划,我们需要知道c++训练的编号以及训练的时间。根据题目描述,我们可以得知c++训练的编号为2。然而,题目中没有提供c++训练的具体时间。因此,我们无法确定c++训练的时间。 综上所述,我们无法确定c++训练的具体计划。 #### 引用[.reference_title] - *1* *3* [CCF CSP 202212-2 训练计划C++)](https://blog.csdn.net/qq_46092061/article/details/129207826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [CCF-CSP真题《202212-2 训练计划》思路+python题解](https://blog.csdn.net/weixin_53919192/article/details/129084465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值