堆+++

本文介绍了一种解决烤鸡翅问题的算法思路。通过使用最大堆数据结构,该算法可以高效地处理顾客订单,确保每次都能为顾客提供尽可能多的鸡翅。当现有鸡翅不足以满足新顾客需求时,算法会比较新顾客与已服务顾客的需求,选择需求较少的顾客进行服务替换。
nocow [url]http://www.nocow.cn/index.php/Heap_Pascal[/url]
=w= c++ 自带堆

栗子
【2235烤鸡翅】[url]http://cojs.tk/cogs/contest/problem.php?ctid=303[/url]
[题解]
对于当前的一个顾客i
1.剩余鸡翅足够,卖给他
2.剩余鸡翅不够,选择已卖出的人中所需鸡翅最多的人j,
如果 鸡翅i<鸡翅j 那么替换 ,人数不变,且剩余鸡翅增加
[代码]

var
n,i,y,max,d,ren,r:longint;tot:int64;
x,que:array [0..250010]of longint;
procedure swap(x,y:longint);var i:longint;begin
i:=que[x]; que[x]:=que[y]; que[y]:=i;
end;
procedure insert(y,x:longint);begin
que[x]:=y;
while (x>1)and(que[x]>que[x div 2]) do
begin
swap(x,x div 2);
x:=x div 2;
end;
end;
procedure down;var i,j:longint;begin
i:=1;
if i*2+1<=r then
begin
if que[i*2]>que[i*2+1] then j:=i*2 else j:=i*2+1;
end
else if i*2<=r then j:=i*2 else exit;
while que[i]<que[j] do
begin
swap(i,j);
i:=j;
if i *2+1<=r then
begin
if que[i*2]>que[i*2+1] then j:=i*2 else j:=i * 2+1;
end
else if i *2<=r then j:=i *2 else exit;
end;
end;
begin
assign(input,'wing.in');reset(input);
assign(output,'wing.out');rewrite(output);
read(n);
tot:=0; r:=0;
for i:=1 to n do read(x[i]);
for i:=1 to n do
begin
inc(tot,x[i]);
read(y);
if tot>=y then
begin
inc(r);
insert(y,r);
dec(tot,y);
inc(ren);
end else
begin
if que[1]>y then
begin
inc(tot,que[1]-y); que[1]:=y; down;
end;
end;
end;
write(ren);
close(input);close(output);
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值