t073 t015 魔法物品

2021-09-29 18:57:18 字數 2154 閱讀 2904

time limit: 1 second

memory limit: 128 mb

有兩種型別的物品:普通物品和魔法物品。每種普通物品有乙個價值p,但每種魔法物品有兩種價值:鑑定前的價值p1和鑑定後的

價值p2(保證p2>p1)。

為了鑑定乙個魔法物品,你需要購買乙個鑑定卷軸。鑑定完一件魔法物品以後,鑑定卷軸便會消失。每個鑑定將會消耗pi元錢,如

果沒有足夠的錢,你將無法購買任何鑑定卷軸。

現在,你正在乙個集市中,同時擁有很多物品。你知道每件物品的價值並且想要**全部物品。那麼,你最多能夠獲得多少錢呢?

你可以假定:

? 開始的時候你沒有錢。

? 所有的魔法物品都還沒有被鑑定。

? 只要你有足夠的錢,你可以購買任意多的鑑定卷軸。

【資料規模】

0< pi<= 5000

0 < p <= 10000

0 < p1 < p2 <= 10000

對於30%的資料 n <= 50,對於100%的資料 n <= 1000

第一行有兩個整數n和pi,表示你擁有的物品數和乙個鑑定卷軸**。

接下來n行,每行給出一件物品的**。

對於每件普通物品,那一行僅有乙個整數p。

對於每件魔法物品,那一行將會有兩個整數p1和p2。

乙個整數表示你最多能夠獲得多少錢。

2 10

1020 100

100
【題解】

我們先假定:值得買的魔法物品都買了(即a[2]-a[1] > pi的卷軸),然後它們的價值是a[2]-pi;

只要能買乙個鑑定軸,就所有的值得買的魔法物品都可以買了。如果賣掉了所有的普通物品和那些不值得買的魔法物品(當做普通物品賣)所湊的錢還不夠買乙個鑑定軸。必然要把一些已經鑑定過的魔法卷軸改為不鑑定直接賣掉以此來湊錢買乙個鑑定軸。這會損失一些錢。每個值得買的魔法物品變成普通物品會損失a[2]-pi-a[1]點價值。要讓損失的價值最少。就要從n個值得買的魔法物品中選出若干個物品。這些物品都有乙個重量和價值。重量是它能湊的錢的數(也即a[1],也即普通物品**),然後價值是它損失的價值。我們要讓損失的價值最少。然後這個問題的容量就是所需要湊的錢的數目,也即pi減去那些不值得買的魔法物品和普通物品的**之和。設其為m;

問題就變成乙個容量為m的揹包。n個物品。求能使得揹包裝滿的最小價值。

f陣列中的下標代表湊的錢的數目,最後我們要獲取f[m];然後這是乙個0/1揹包。要逆序更新。還有乙個問題。可能所有的物品不能恰好湊到m,可能會超過m。這樣我們就要記錄超過了多少。最後要加上去。因為我們只要買乙個卷軸就好了。剩下的錢不算是損失的。因為也是通過把魔法物品當做普通物品賣來的。

最後用之前累加的普通物品和魔法物品的和減去f[t]再加上rest[m]即可,(t在夠買乙個卷軸時為m),rest為這種湊的方案剩下的錢。如果把所有的魔法物品當做普通物品賣掉都不夠買乙個卷軸,則t!=m。

【**】

#include #include #include using namespace std;

int n,pi,a[1001][3],num = 0,w[1001],c[1001],f[5001],rest[5001];

int main()

} int su = 0,su2 = 0; //su是把所有值得當魔法物品賣的和普通物品的**的累加的和。

//su2則只是把普通物品的**的累加起來。 (這裡的普通物品包括不值得當魔法物品賣的物品)

for (int i = 1;i <= n;i++) //根據n個物品的資訊累加

if (a[i][0] == 1)

su+=a[i][1],su2+=a[i][1];

else

}if (su2 >= pi) //如果普通物品的累加和夠買乙個鑑定卷。則直接輸出答案。

else

if (f[ju] > f[j] + c[i]) //如果能更新解 }}

int tt = m;

while (f[tt] == 2100000000/3) //這是把所有值得當魔法物品的物品當做普通物品來賣都湊不夠錢的情況。

//這樣所有的魔法物品都會虧損。

tt--;

printf("%d",su-f[tt]+rest[m]); //減掉虧損的錢然後加上超過m的錢。

}return 0;

}

計蒜客t36352 魔法

肯定我要佔滿所有的葉子結點,否則以乙個葉子節點建樹的時候你選的所有點就都在一棵子樹裡,也就不符合要求。反過來,選擇了所有葉子節點,可以證明它是可行的,所以葉子節點構成的集合滿足要求而且最小。如果k 0 k 0k 0直接求出度為1 11的點的數目就好了 如果k 1 k 1k 1,列舉刪哪條邊,我用 x...

計蒜客 T1551 魔法少女

前些時間虛淵玄的鉅獻小圓著實火了一把。在黑長直 小炎 往上爬樓去對抗魔女之夜時,她遇到了乙個問題想請你幫忙。因為魔女之夜是懸浮在半空的,所以她必須要爬樓,而那座廢墟一共有 nn 層,而且每層高度不同,這造成小炎爬每層的時間也不同。不過當然,小炎會時間魔法,可以瞬間飛過一層或者兩層 即不耗時 但每次瞬...

計蒜客T2237 魔法 樹

題目大意 資料範圍 題解 這個題挺好玩的 可以用反證法,發現所有葉子必須都得選而且所有葉子都選了合法。故此我們就是要使得,一次操作之後使得葉子的個數最少。這怎麼弄呢?我們發現,如果一條邊相連的兩個點 x 和 y d i 表示點 i 的度數,不妨設 d x le d y 滿足 d y ge 3 且 d...