zoj1200

题目大意:

制作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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值