p1389.dpr

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· DPR 代码 · 共 106 行

DPR
106
字号
PROGRAM p1389;

TYPE
        DataType=record
        joinin                          :Boolean;
        pos_,w                          :Longint;
        end;

VAR
        n,part,p                        :Longint;
        finish,total                    :Longint;
        data                            :array[1..100000]of DataType;

PROCEDURE Readin;
var
        i,a,b,c,d                       :Longint;
begin
readln(n);
total:=0;
for i:=1 to n do
        begin
        readln(a,b,c,d);
        with data[i+i-1] do
                begin
                joinin:=true;
                pos_:=a;
                w:=c * d;
                end;
        with data[i+i] do
               begin
               joinin:=false;
               pos_:=a+b;
               w:=c * d;
               end;
        total:=total + b * c * d;
        end;
readln(finish);
end;

PROCEDURE Sort(left,right:Integer);
var
        i,j                                     :Longint;
        key                                     :Longint;
        temp                                    :DataType;
begin
i:=left-1;
j:=right+1;
key:=data[left].pos_;
repeat
        repeat dec(j); until data[j].pos_<=key;
        repeat inc(i); until data[i].pos_>=key;
        if i<j then
                begin
                temp:=data[i];
                data[i]:=data[j];
                data[j]:=temp;
                end else break;
until false;
if j+1<right then Sort(j+1,right);
if left<i-1 then Sort(left,i-1);
end;

PROCEDURE Search;
var
        i                                       :Longint;
        count,reach                             :Longint;
        ans                                     :Extended;
begin
if total<finish then
        begin
        writeln('OVERFLOW');
        exit;
        end;

Sort(1,n+n);


count:=data[1].w;
reach:=0;

for i:=2 to n + n do
        begin
        reach:=reach + count * ( data[i].pos_ - data[i-1].pos_);
        if reach>=finish then break;

        if data[i].joinin then inc(count,data[i].w)
                else dec(count,data[i].w);
        end;

ans:=data[i].pos_;
if reach>finish then ans:=ans - (reach - finish) / count;
writeln(ans:0:2);
end;


BEGIN
//assign(input,'p.in');
//reset(input);
readln(part);
for p:=1 to part do
        begin
        Readin;
        Search;
        end;
END.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?