description
小n 最近迷上了購物每天都讓小a 和小t 陪她逛街拿東西。最近商店出了這樣的乙個
活動:買東西送積分,就是買一件物品,送當前物品的積分ci*當前的倍率,初始倍率是1;
input
第一行有乙個整數n表示要買的種類。
接下來n行每行2個整數ki,ci表示數量和積分
接下來一行有乙個正整數t表示獎勵的倍數
接下來一行有t個遞增的整數ti表示買了ti個物品之後以後買的物品得到的積分倍率將是(i+1)
output
乙個整數,表示小n能得到的最多積分
題解
從小到大排序,貪心策略。
**
var
ans,sum:int64;
n,m:longint;
ki,ci,t:array [1..101] of int64;
procedure
init;
var i,j:longint;
begin
readln(n);
sum:=0;
for i:=1
to n do
begin
readln(ki[i],ci[i]);
sum:=sum+ki[i];
end;
readln(m);
for i:=1
to m do
read(t[i]);
for i:=2
to m do
for j:=1
to i-1
do t[i]:=t[i]-t[j];
end;
procedure
qsort
(l,r:longint);
var i,j:longint;
mid,tt:int64;
begin
if l>=r then
exit;
i:=l; j:=r;
mid:=ci[(l+r) div
2]; repeat
while ci[i]do inc(i);
while ci[j]>mid do dec(j);
if i<=j then
begin
tt:=ci[i]; ci[i]:=ci[j]; ci[j]:=tt;
tt:=ki[i]; ki[i]:=ki[j]; ki[j]:=tt;
inc(i); dec(j);
end;
until i>j;
qsort(i,r);
qsort(l,j);
end;
procedure
main;
var p,q,ti,i:longint;
k:int64;
begin
k:=0; ans:=0;
p:=1; q:=1; ti:=1;
while kdo
begin
if t[p]then
begin
ans:=ans+t[p]*ci[q]*ti;
ki[q]:=ki[q]-t[p];
inc(ti);
k:=k+t[p];
inc(p);
endelse
begin
ans:=ans+ki[q]*ci[q]*ti;
t[p]:=t[p]-ki[q];
k:=k+ki[q];
inc(q);
end;
if p>m then
begin
for i:=q to n do
ans:=ans+ci[i]*ki[i]*ti;
k:=sum;
end;
end;
write(ans);
end;
begin
init;
qsort(1,n);
main;
end.
NOIP2012模擬10 6 購買
description 小n 最近迷上了購物每天都讓小a 和小t 陪她逛街拿東西。最近商店出了這樣的乙個 活動 買東西送積分,就是買一件物品,送當前物品的積分ci 當前的倍率,初始倍率是1 當倍率是i 的時候,如果你買的物品等於ti 個,那麼倍率將加1.最多積分的人可以得到超限 量版的圓神手辦。小n...
NOIP2012模擬10 6 填充棋盤
description 橫一劃豎一劃,橫一劃豎一劃 小r畫出了乙個n m的棋盤。由於noip快要到了,小r有了乙個奇妙的想法。在棋盤的每乙個小方格中填入n,o,i,p這4個字母中的乙個,若棋盤中每乙個2 2的小棋盤中都有n,o,i,p這4個字母,小r就認為這個棋盤是幸運棋盤。小r想知道一共有多少種不...
NOIP2012模擬10 25 旅行
給定乙個n行m列的字元矩陣,代表空地,x 代表障礙。移動的規則是 每秒鐘以上下左右四個方向之一移動一格,不能進入障礙。計算 在空地中隨機選擇起點和終點 可以重合,此時最短耗時為0 從起點移動到終點最短耗時的平均值。每一行每一列至多有1個障礙,並且障礙不在對角線方向相鄰。以下矩陣是不合法的 x x.第...