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
原创粉丝点击