您的位置:首页 > 其它

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

2017-04-17 20:15 288 查看
其实我也不知到为什么洗衣服和晒衣服是独立的。。。

既然是独立的,我们就贪心的把每件衣服最快能洗完的时刻和最快能烘干的时刻分别先预处理出来,就是贪心的往当前结束时间最早的机器里放(堆维护)。

然后两个数组一个正着一个倒着加起来取个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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: