[2017雅礼集训]day4 T1 洗衣服 贪心

其实我也不知到为什么洗衣服和晒衣服是独立的。。。
既然是独立的,我们就贪心的把每件衣服最快能洗完的时刻和最快能烘干的时刻分别先预处理出来,就是贪心的往当前结束时间最早的机器里放(堆维护)。
然后两个数组一个正着一个倒着加起来取个max就可以了。
代码:

type
 node=record
    dt:int64;
    id:longint;
  end;

var
  l,n,m,i,j,size,o:longint;
  z,ans:int64;
  w,d:array[1..2000000]of int64;
  t,r:array[1..2000000]of int64;
  dui:array[1..1001000]of node;
const maxl=10000000000000000;

procedure swap(var x,y:node);
var
  t:node;
begin
  t:=x;
  x:=y;
  y:=t;
end;

procedure ins(x:int64;y:longint);
var
  i:longint;
begin
  inc(size);
  dui[size].dt:=x;
  dui[size].id:=y;
  i:=size;
  while (i>1)and(dui[i].dt<dui[i div 2].dt) do
  begin
    swap(dui[i],dui[i div 2]);
    i:=i div 2;
  end;
end;
procedure del();
var
  i:longint;
begin
  dui[1]:=dui[size];
  dui[size].dt:=maxl;
  dui[size].id:=0;
  dec(size);
  i:=1;
  while (i*2+1<=size)and((dui[i].dt>dui[i*2].dt)or(dui[i].dt>dui[i*2+1].dt)) do
  begin
    if (dui[i*2].dt<=dui[i*2+1].dt) then begin swap(dui[i],dui[i*2]); i:=i*2; end
    else
    begin
      swap(dui[i],dui[i*2+1]);
      i:=i*2+1;
    end;
  end;
end;
begin
  readln(l,n,m);
  size:=0;
  for i:=1 to 100010 do
    dui[i].dt:=maxl;
  for i:=1 to n do
  begin
    read(w[i]);
    ins(w[i],i);
  end;
  for i:=1 to l do
  begin
    t[i]:=dui[1].dt;
    o:=dui[1].id;
    del;
    ins(t[i]+w[o],o);
  end;
  for i:=1 to 100010 do
  begin
    dui[i].dt:=maxl;
    dui[i].id:=0;
  end;
  size:=0;
  for i:=1 to m do
  begin
    read(d[i]);
    ins(d[i],i);
  end;
  for i:=1 to l do
  begin
    r[i]:=dui[1].dt;
    o:=dui[1].id;
    del;
    ins(r[i]+d[o],o);
  end;
  ans:=0;
  for i:=1 to l do
    if ans<(t[i]+r[l-i+1])then ans:=t[i]+r[l-i+1];
  writeln(ans);

end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值