NOIP2004提高组“合并果子”双队列问题

2025-03-06 03:51:23
推荐回答(1个)
回答1:

program fruit;

var
a, b: array[1..300001] of int64;
t: array[1..20000] of int64;
i, j, k, n, h1, h2, t1, t2: longint;
ans,ans1:int64;

procedure pusha(n: int64);
begin
Inc(t1);
a[t1] := n;
end;

procedure pushb(n: int64);
begin
Inc(t2);
b[t2] := n;
end;

begin
Assign(input, 'fruit.in');
Assign(output, 'fruit.out');
reset(input);
rewrite(output);
h1 := 1;
t1 := 0;
h2 := 1;
t2 := 0;
readln(n);
for i := 1 to n+1 do
begin
a[i]:=2147483649;
b[i]:=2147483649;
end;
for i := 1 to n do
begin
Read(k);
Inc(t[k]);
end;
for i := 1 to 20000 do
for j := 1 to t[i] do
pusha(i);
for i := 1 to n - 1 do
begin
if (a[h1] + a[h1 + 1] <= b[h2] + b[h2 + 1]) and
(a[h1] + a[h1 + 1] <= a[h1] + b[h2]) then
begin
pushb(a[h1] + a[h1 + 1]);
ans := ans + a[h1] + a[h1 + 1];
Inc(h1, 2);
end
else if (a[h1] + a[h1 + 1] >= b[h2] + b[h2 + 1]) and
(b[h2] + b[h2 + 1] <= a[h1] + b[h2]) then
begin
pushb(b[h2] + b[h2 + 1]);
ans := ans + b[h2] + b[h2 + 1];
Inc(h2, 2);
end
else if (a[h1] + a[h1 + 1] >= a[h1] + b[h2]) and
(b[h2] + b[h2 + 1] >= a[h1] + b[h2]) then
begin
pushb(a[h1] + b[h2]);
ans := ans + a[h1] + b[h2];
Inc(h1);
Inc(h2);
end;
end;
writeln(ans);
Close(input);
Close(output);
end.
上面那个程序思路好乱。。
给个我写的程序,排序用的是O(N)的桶排(NlogN的快拍比队列操作部分用时还长)