解題報告 Diablo Items

2022-06-04 02:30:11 字數 2924 閱讀 3527

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 地 址...