题目大意:
制作K个机器人,每个人机器人需要M分钟被制作出来,每个机器人需要S分钟走到工作现场,工作W分钟,带回来C单元格资源,回来的时间也为S分钟。
先在我们的工作就是模拟这个过程,找出收集至少10000单元个资源需要多少分钟。
解题思路:
用heap数组维持一个最小堆,有效长度等于K,初始值为第i个机器人制作出来+到达作业现场的时间S,即m*i+s。接下我们就要模拟作业过程:
总时间totaltime值为heap[1],再加上工作时间W,这个时候第一个机器人就准备回去了,所以需要加上回去时间S,再到作业现场时间S,再工作时间W,即S+S+W,更新到heap[1],同时调整最小堆。遍历完后,totaltime需要加上机器人回到出发地的时间S,即为最后结果。
我自己肯定是想不出来的。。。只能理解题解
代码如下:
#include<iostream>
#include<fstream>
using namespace std;
int s,w,c,k,m;
int heap[11000];
int times, totaltime;
void heapwork(int id)
{
int lkid=id<<1, rkid=(id<<1)+1, root=id;
if(lkid<=k && heap[lkid]<heap[root])
root=lkid;
if(rkid<=k && heap[rkid]<heap[root])
root=rkid;
if(root!=id)
{
swap(heap[root], heap[id]);
heapwork(root);
}
}
int main()
{
while(cin>>s)
{
cin>>w>>c>>k>>m;
totaltime=0;
times=9999/c+1;
if(k>times)
k=times;
for(int i=1; i<=k; ++i)
heap[i]=m*i+s;
for(int i=1; i<=times; ++i)
{
if(totaltime< heap[1])
totaltime=heap[1];
totaltime+=w;
heap[1]+=s+s+w;
heapwork(1);
}
totaltime+=s;
cout<<totaltime<<endl;
}
return 0;
}