p2109.pas

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

PAS
91
字号
PROGRAM p2109;

CONST
        max=1e10;
        small=1e-8;

TYPE
        Node=record
                a,b                     :Integer;
                order                   :Extended;
        end;

VAR
        ans                             :Extended;
        n,m                             :Integer;
        food                            :array[1..1000]of Node;

PROCEDURE Readin;
var
        i                               :Integer;
begin
for i:=1 to m do
        begin
        readln(food[i].a,food[i].b);
        if food[i].b=0 then food[i].order:=max else food[i].order:=food[i].a/food[i].b;
        end;
end;

FUNCTION Find(left,right:Integer;key:Extended):integer;
var
        temp                            :Node;
        i,j                             :Integer;
begin
i:=left-1;
j:=right+1;
repeat
        repeat dec(j) until food[j].order<key+small;
        repeat inc(i) until food[i].order>key-small;
        if (i<j) then
                begin
                temp:=food[i];
                food[i]:=food[j];
                food[j]:=temp;
                end else break;
until false;
find:=j;
end;

PROCEDURE Sort(left,right:Integer);
var
        mid                             :Integer;
begin
mid:=find(left,right,food[left].order);
if mid>left then Sort(left,mid);
if mid+1<right then Sort(mid+1,right);
end;

PROCEDURE Main;
var
        i                               :Integer;
begin
ans:=0;
i:=m;
while (i>=1)and((n>=food[i].b)or(n>0)) do
        begin
        if n>=food[i].b then
                begin
                ans:=ans+food[i].a;
                n:=n - food[i].b;
                end else
                begin
                ans:=ans + food[i].a * n / food[i].b;
                n:=0;
                end;
        dec(i);
        end;
writeln(round(ans*1000)/1000:0:3);
end;

BEGIN
//assign(input,'p.in');
//reset(input);
readln(n,m);
while (n>-1)and(m>-1) do
        begin
        Readin;
        if m>0 then sort(1,m);
        main;
        readln(n,m);
        end;
END.

⌨️ 快捷键说明

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