收集资源

本文介绍了一个关于资源收集的模拟算法问题。该问题涉及制造机器人并安排它们收集资源的过程,目标是最小化收集指定数量资源所需的时间。文章提供了一段C语言实现的代码,通过模拟机器人的生产和工作流程来解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目详情
某基地需要收集至少10000个单位的资源。为此他们打算制造k个机器人,制造每个机器人需要耗时m个小时。每个机器人一旦制造成功,从基地需要s小时走到收集资源的地方,再工作w小时,收集c个单位的资源,再花费s小时返回基地。虽然制造机器人可以连续的制造,但是收集资源的地方每次只能容纳一个机器人,也就是说只有当一个机器人收集了资源离开返回基地的时候,下一个机器人才能进入收集。问收集10000个单位的资源,至少需要多少小时?输入s,w,c,k,m都不超过1000000。

这个题看似简单,不过我没有怎么练习过模拟题,逻辑思维能力也不强,还要加强练习...

#include<stdio.h>

//现在发现这个结构一点用都没有,看来当时大脑已经不太清醒了.
//这个采矿循环在机器人完全生产完之前是不稳定的,会出现新出来的机器人插队的情况,要注意
typedef   struct  Robbot
{
     int  startWork;
}Rob;

//机器人采矿队列
Rob robs[1000010];
int  rTop;
//机器人生产队列
Rob build[1000010];
int  bTop;

int  howmany ( int  s, int  w, int  c, int  k, int  m)
{
     int  i;
     int  cNow = 0;//采集总数
     int  finTime;//当前时间
    
     for (i = 0; i < k; i++)
    {
        build[i].startWork = (k - i) * m + s;
    }
    i = 0, bTop = k - 1, rTop = 1;
    robs[0] = build[k - 1];
    finTime = build[k - 1].startWork;
     while (cNow < 10000)
    {
//当前机器人完成采矿时间
         int  temp = robs[i].startWork + w;
//当有多余一个机器人时,当前机器人的完成时间对下一个造成影响
         if (rTop > 1 && robs[i].startWork + w > robs[(i + 1) % rTop].startWork)
        {
            robs[(i + 1) % rTop].startWork = robs[i].startWork + w;
        }
        
        cNow += c;
        finTime = robs[i].startWork + w + s;//到工厂的时刻,卸货时刻
        robs[i].startWork = finTime + s; //下一次到入矿队列的时刻
        i = (i + 1) % rTop;
        //当下一个出场机器人在队列当前机器人之前时,插入
         if (bTop > 0 && build[bTop - 1].startWork < robs[i].startWork)
        {
             int  p = rTop;
             for (; p > i; p--)//所有i-(p-1)的机器人后移,不会影响环形队列的顺序
            {
                robs[p] = robs[p - 1];
            }
            robs[i] = build[bTop - 1];
             if (robs[i].startWork < temp)//基于上一个机器人的完工时间,修正才插入的机器人的开始时间
            {
                robs[i].startWork = temp;
            }
            rTop++;
            bTop--;
        }
    }
     return  finTime;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int  main()
{    
    printf( "%d" ,howmany(1,1,1,1,1));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值