题目: | 小Q玩游戏——经营餐厅 | |
来源: | Tyvj 1315 | |
题目大意: | N个物品,买M件,每个物品有个初始加个,每买一次加个上升一定数值,求最小花 费 | |
数据范围: | 1≤N,M≤1000。 | |
样例: | 2 3 100 100 190 5 | 485 |
做题思路: | 价格,物品,果断背包吗?额 错了,贪心取最小就好,堆操作吗?是的 | |
知识点: | 贪心 堆 |
type
act=record
num,d:longint;
end;
var
a:array[0..1000]of act;
n,i,tot,t,m,p:longint;
procedure ad_up(i:longint);
var
t:act;
begin
while i div 2>=1 do
begin
ifa[i].num<a[i div 2].num then
begin
t:=a[i];
a[i]:=a[i div 2];
a[i div 2]:=t;
i:=i div 2;
end
else break;
end;
end;
procedure ad_down(i:longint);
var
t:act;
begin
while i*2<=tot do
begin
i:=i*2;
if(a[i].num>a[i+1].num) and (i<n) then inc(i);
ifa[i].num<a[i div 2].num then
begin
t:=a[i];
a[i]:=a[i div 2];
a[i div 2]:=t;
end
else break;
end;
end;
begin
readln(n,m);
fori:=1 to n do
begin
readln(t,p);
inc(tot);
a[tot].num:=t;
a[tot].d:=p;
ad_up(tot);
end;
t:=0;
fori:=1 to m do
begin
inc(t,a[1].num); {<不断向外刷最小的>}
a[1].num:=a[1].num+a[1].d;
ad_down(1);
end;
writeln(t);
end.
题目来源:
http://www.tyvj.cn:8080/Problem_Show.asp?id=1315