diablo items
【題目描述】
diablo ii中,有兩種物品:普通物品和魔法物品。顯然,魔法物品有普通物品沒有的神奇力量。
魔法物品和普通物品都可以被賣掉:乙個普通物品只有乙個價值pi;而乙個魔法物品有兩個價值pi1和pi2,當使用購買的魔法卷軸鑑定過這個魔法物品以後,它的價值就變為pi2,否則它只具有pi1的價值(當然pi2一定要大於pi1)。鑑定乙個魔法物品需要花費q來購買乙個魔法卷軸,每個魔法卷軸只能使用一次。
你的手中有一些物品。對於普通物品,你已經知道了它們的價值pi;對於魔法物品,你已經知道了它們的價值pi1和pi2。
現在,你想要把它們全部賣掉,以得到最大的收益。
注意:1. 開始時,你的收中沒有錢,無法購買卷軸。
2. 開始時,沒有任何魔法物品被卷軸鑑定過。
3. 如果你的手中有足夠多的錢,你可以購買足夠多的卷軸,但你手中的剩餘的錢不能為負。
【輸入格式】
每個測試點有多組測試資料:
對於每組測試資料:
第一行兩個整數n和q,n表示擁有物品的數量,q表示購買乙個魔法卷軸的花費。
第二行..第n+1行每行有乙個整數或兩個整數,如果為乙個數,表示這件物品是普通物品,價值為pi,否則為魔法物品兩個價值為pi1和pi2。
【輸出格式】
對於每組測試資料:
乙個整數,即最大的收益。
【樣例輸入】
2 1058
2 10
1010 100
【樣例輸出】
13100
【資料範圍】
0<=n<=1000
q<=30000
pi<=10000
pi1首先將普通物品和 pi2-pi1-q<0
的魔法物品賣了。
然後如果可以買得起卷軸,就都買了卷軸,然後賣魔法物品。(顯然,pi2>q
,所以再賣魔法物品的時候,手裡的錢會越來越多)
如果買不起的話,就用背滿包判斷賣哪些未鑑定的物品。
vara:array[0..1000,0..2] of longint;
f:array[0..10000] of longint;
cost,n,m,q:longint;
procedure init;
vari,x,y:longint;
s,t:string;
begin
m:=0;
cost:=0;
readln(n,q);
for i:=1 to n do
begin
readln(s);
if (pos(' ',s)=0) then
begin
val(s,x);
inc(cost,x);
endelse
begin
t:=copy(s,pos(' ',s)+1,length(s)-pos(' ',s));
s:=copy(s,1,pos(' ',s)-1);
val(t,x);
val(s,y);
if (x-qelse
begin
inc(m);
a[m][0]:=x;
a[m][1]:=y;
a[m][2]:=x-y-q;
end;
end;
end;
end;
function min(a,b:longint):longint;
begin
if (a<0) then exit(b);
if (b<0) then exit(a);
if (aend;
function run:longint;
varsum,need,next,i,j:longint;
begin
sum:=0;
if (cost>=q) or (m=0) then
begin
sum:=cost;
for i:=1 to m do
inc(sum,a[i][0]-q);
exit(sum);
end;
need:=q-cost;
fillchar(f,sizeof(f),255);
f[0]:=0;
for i:=1 to m do
for j:=need downto 0 do
begin
if (f[j]<>-1) then
begin
next:=j+a[i][1];
next:=min(next,need);
f[next]:=min(f[next],f[j]+a[i][2]); //可以更新,則是賣鑑定後的物品,背滿包。
end;
end;
if (f[need]=-1) then
begin
sum:=cost;
for i:=1 to m do
inc(sum,a[i][1]);
exit(sum); //物品全賣了也不夠買卷軸的
endelse
begin
sum:=cost;
for i:=1 to m do
inc(sum,a[i][0]-q); //先不管一開始買卷軸的「貸款」
exit(sum-f[need]); //將「貸款」減去
end;
end;
begin
assign(input,'items.in');reset(input);
assign(output,'items.out');rewrite(output);
while (not eof) do
begin
init;
writeln(run);
end;
close(input);
close(output);
end.
Block Voting 解題報告
這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...
Safebreaker 解題報告
又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...
路由 解題報告
路由 問題描述 有乙個tcp ip網路 每台計算機都有乙個或多個網路介面。每個介面根據它的ip位址和子網掩碼來識別 即兩個4位元組的數,兩個字 節之間有乙個 號.子網掩碼有乙個二進位制表示法 有k個 1 然 後是 m 個 0 k m 8 4 32 如 212.220.35.77 是乙個 ip 地 址...