zoj1200
来源:互联网 发布:csol大刀优化软件 编辑:程序博客网 时间:2024/06/06 03:17
题目大意:
制作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;}
0 0