正文

Zju 1200 Mining2006-12-23 15:54:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/21845.html

分享到:

2178592 2006-12-23 15:29:25 Accepted 1200 C++ 00:00.00 428K Crux.D

    堆维护。这个模拟题根本没有思路,看了论坛上AndyZh的算法才明白的。

    把每个机器人到达矿区的时间排序,从中选出最小时间,然后更新此时间,重排堆。

    (最小)堆排的算法是:与下面子节点中较小的节点比较,大则交换,小则停止。

#include <cstdio>

int s, w, c, l, m, h[10000], t, ans;

bool init()
{
 if (scanf("%d", &s) == EOF) return false;
    scanf("%d %d %d %d", &w, &c, &l, &m);

 int i;
 ans = 0, t = 9999 / c + 1;
 if(l > t) l = t;
 for(i = 0; i < t; i ++)
  h[i] = m * i + m + s;
 return true;
}

void push()
{
 int cur = 0, j = h[0], next = cur * 2 + 1;; // h[0] min
 if(ans < h[0]) ans = h[0];
 h[cur] += s + s + w; ans += w; 
 // heap-lize
 while(next < l)
 {
  if(next + 1 < l && h[next] > h[next + 1]) next ++;
  if(j > h[next])
  {
   h[cur] = h[next];
   cur = next;
   next = cur * 2 + 1;
  }
  else break;
 }
 h[cur] = j;
}

int main()
{
 freopen("in.txt", "r", stdin);
 while(init())
 {
  int i;
  for(i = 0; i < t; i ++) push();
  printf("%d\n", ans + s);
 }
 return 0;
}

 

阅读(4082) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册