求助,小根堆哪里炸了
pascal吧
全部回复
仅看楼主
level 1
【问题描述】
操作系统把内存分为 N个块(从 1 到 N编号)。操作系统会向内存管理模块请求占用最小编号的空闲内存块,或读写某个块。一开始,所有的块都是空闲。当一个块T分钟内没有请求(读写或分配),也认为是空闲的。对于读写请求。内存管理模块会检测这个块是否空闲的。如果是空闲的,读写就会失败。N=30000,T=10分钟。
【输入】
每行包含一个请求 或内存块取。
<Time> + 在 Time秒时请求一块新内存。
< Time>.< BlockNo > 在 Time秒时请求读写 BlockNo号内存 。
所有请求 按照时间的先后排序 ,同一时间的请求按照输入顺序执行。
【输出】
对于 “在 Time秒时请求一块新内存”,输出个数字,表示最小编号的空闲内存块。
对于 “在 Time秒时请求读写 BlockNo号内存”,输出“+”(成功),或“-”(失败)。
本人只对了部分点
以下是程序
Type
using=record
tick,num:longint;
end;
Var
ava:array[1..30000] of boolean;
ing:array[0..80000] of using; l1:longint;
wait:array[0..80000] of longint; l2:longint;
qst:string;
i,time,ask:longint;
Procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x; x:=y; y:=t;
end;
Procedure newspace;
var
i,now:longint;
t:using;
begin
now:=wait[1];
ava[now]:=true;
wait[1]:=maxlongint;
swap(wait[l2],wait[1]);
i:=1;
l2:=l2-1;
while (wait[i]>wait[2*i]) or (wait[i]>wait[2*i+1]) do
begin
if wait[2*i]<wait[2*i+1] then
begin
swap(wait[i],wait[2*i]);
i:=2*i
end
else
begin
swap(wait[i],wait[2*i+1]);
i:=2*i+1;
end
end;
inc(l1);
ing[l1].num:=now;
ing[l1].tick:=time+600;
i:=l1;
while (ing[i].tick<ing[i div 2].tick) and (i<>1) do
begin
t:=ing[i]; ing[i]:=ing[i div 2]; ing[i div 2]:=t;
i:=i div 2;
end;
end;
Procedure release;
var
i,now:longint;
t:using;
begin
now:=ing[1].num;
ava[now]:=false;
ing[1].tick:=maxlongint;
ing[1].num:=0;
t:=ing[1]; ing[1]:=ing[l1]; ing[l1]:=t;
i:=1;
l1:=l1-1;
while (ing[i].tick>ing[2*i].tick) or (ing[i].tick>ing[2*i+1].tick) do
begin
if ing[2*i].tick<ing[2*i+1].tick then
begin
t:=ing[i]; ing[i]:=ing[2*i]; ing[2*i]:=t;
i:=2*i
end
else
begin
t:=ing[i]; ing[i]:=ing[2*i+1]; ing[2*i+1]:=t;
i:=2*i+1;
end
end;
inc(l2);
wait[l2]:=now;
i:=l2;
while (wait[i]<wait[i div 2]) and (i<>1) do
begin
swap(wait[i],wait[i div 2]);
i:=i div 2;
end;
end;
Procedure update(x:longint);
var
i:longint;
t:using;
begin
i:=x;
while (ing[i].tick>ing[2*i].tick) or (ing[i].tick>ing[2*i+1].tick) do
begin
if ing[2*i].tick<ing[2*i+1].tick then
begin
t:=ing[i]; ing[i]:=ing[2*i]; ing[2*i]:=t;
i:=2*i
end
else
begin
t:=ing[i]; ing[i]:=ing[2*i+1]; ing[2*i+1]:=t;
i:=2*i+1;
end
end;
end;
Begin
for i:=0 to 80000 do wait[i]:=maxlongint;
for i:=1 to 30000 do wait[i]:=i;
wait[30001]:=maxlongint;
for i:=0 to 80000 do ing[i].tick:=maxlongint;
l2:=30000;
while not eof do
begin
readln(qst);
if pos('+',qst)>0 then
begin
delete(qst,length(qst)-1,2);
val(qst,time);
while time>=ing[1].tick do release;
writeln(wait[1]);
newspace;
end
else
begin
val(copy(qst,1,pos('.',qst)-2),time);
while time>=ing[1].tick do release;
val(copy(qst,pos('.',qst)+2,length(qst)-pos('.',qst)-1),ask);
if ava[ask] then writeln('+') else writeln('-');
if ava[ask] then
begin
ing[ask].tick:=time+600;
update(ask);
end;
end;
end;
End.
2016年07月20日 04点07分 1
level 11
stl大法好٩(ˊᗜˋ*)و
2016年07月22日 08点07分 2
1