题目详情
某基地需要收集至少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;
typedef struct Robbot
{
int startWork;
}Rob;
//机器人采矿队列
Rob robs[1000010];
int rTop;
//机器人生产队列
Rob build[1000010];
int bTop;
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;
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;
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];
{
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 //提示:自动阅卷结束唯一标识,请勿删除或增加。
{
robs[i].startWork = temp;
}
rTop++;
bTop--;
}
}
return finTime;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
printf( "%d" ,howmany(1,1,1,1,1));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。