CCF-CSP 202212-2 训练计划 C++

这是一个处理科目依赖关系的问题,程序接收科目数量、限制天数及每个科目的依赖和所需时间,计算每科的最早开始和最晚开始时间。如果所有科目能在限制天数内完成,则输出最早开始时间,否则只输出最早开始时间。最后,程序还计算了最晚开始时间。

此代码为考研机试练习,未考虑任何优化策略,同为小白可以稍稍借鉴一下,大佬不喜勿喷。

#include<iostream>
#include<math.h>
using namespace std;

int main()
{
    int n,m;//n:限制天数  m:科目个数
    cin>>n>>m;
    int p[m+1];//p[i]为i号科目所依赖的科目编号
    int i,j;
    for(i=1;i<=m;i++)
        cin>>p[i];
    int t[m+1];//t[i]为i号科目所需时间
    for(i=1;i<=m;i++)
        cin>>t[i];
    int Min[m+1],Max[m+1];//Min[i]为i号科目最早开始时间 Max[i]为最晚开始时间
    int e[m+1];//e[i]为i号科目最早结束时间
    for(i=1;i<=m;i++)
    {
        if(p[i]==0)//若i号科目不依赖任何科目
        {
            Min[i]=1;//最早从第一天开始
            e[i]=t[i];//最早结束时间为所花费的时间
        }
    }
    for(i=1;i<=m;i++)
    {
        if(p[i]==0)
            continue;
        for(j=1;j<i;j++)
        {
            if(p[i]==j)//若i号科目依赖j号科目
            {
                Min[i]=Min[j]+t[j];//i最早开始时间=j最早开始时间+j花费时间
                e[i]=Min[i]+t[i]-1;//i最早结束时间=i最早开始时间+i花费时间-1
            }
        }
    }
    int et=0;
    for(i=1;i<=m;i++)
        et=max(et,e[i]);//et为所有科目最早结束时间中最晚的一个
    if(et>n)//若最晚的最早结束时间晚于限制天数
    {
        for(i=1;i<=m;i++)
            cout<<Min[i]<<" ";//无法完成全部训练,只输出最早开始时间
        return 0;
    }

    //若可以完成全部训练
    for(i=1;i<=m;i++)
        cout<<Min[i]<<" ";//输出最早开始时间
    cout<<endl;

    //i事件最晚开始时间=i事件的下一个事件的最晚开始时间-i事件花费的时间
    //注意一个科目可能被多个科目所依赖
    for(i=m;i>=1;i--)//从后往前找
    {
        int flag=0;//flag=1表明i被依赖
        int temp=400;
        for(j=i+1;j<=m;j++)
            if(i==p[j])//若i被j所依赖
            {
                flag=1;
                temp=min(temp,Max[j]);//temp为依赖i的科目中的最早的最晚开始时间,若不是这样,则其他依赖i的科目可能无法完成
            }
        if(flag==1)
            Max[i]=temp-t[i];
        else//若此事件不被任何事件依赖
            Max[i]=n-t[i]+1;//此事件最晚开始时间=限制天数-此事件花费时间+1
    }
    for(i=1;i<=m;i++)
        cout<<Max[i]<<" ";//输出最晚开始时间

    return 0;
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值