切換
舊版
前往
大廳
主題

ZeroJudge - c269: 裴裴與女生們 解題心得

Not In My Back Yard | 2019-07-21 22:29:57 | 巴幣 0 | 人氣 152

題目連結:


題目大意:
給定兩正整數 n 、 T (1 ≦ n ≦ 10, 000,1 ≦ T ≦ 1, 000),代表接下來有n列輸入。每列輸入給定三正整數 s 、 v 、 p (1 ≦ s ≦ 1, 000 ,1 ≦ v ≦ 10 ^ 9 , p = 1 或 2),代表一位女生所需最多的陪伴時間、可以得到的好感度、以及類型。

p = 1 ,代表第一類女生,每陪伴他們一單位的時間可以得到其 v ÷ s 的好感度; p = 2 ,代表第二類女生,要完整地陪伴他們 s 單位時間,才能得到 v 的好感度。

現在有 T 單位的時間可供使用,求最大可獲得的好感度為何?



範例輸入:
//sample input 1
4 10
5 15 2
5 14 2
4 13 2
8 17 2
//sample input 2
4 10
5 15 2
5 14 2
4 13 2
8 17 1


範例輸出:
//sample output 1
29
//sample output 2
30


解題思維:
可以看到這其實就是背包問題(Knapsack)的變形,即時間 → 重量、好感度 → 價值。

如果單純地只有第二類女生,我們可以看到其問題的解法就是直接套上 01 背包的解法。如這題

而比較麻煩的是第一類女生。但是可以把他們看作 s 個第二類女生,且每個女生之 s = 1 、 v = 原本的 v ÷ 原本的 s 。但是直接套用原本的解法的話,女生的「數量」會太多。

因此,我們需要將第一類女生的陪伴時間 s 分作 1 、 2 、 4 、 8 、 …… 、 2 ^ k 以及最後剩下的  s - 2 ^ (k + 1) + 1  這 k + 1 個部分。也就是把這個女生的 s 分成大約 log s 的部分。

然後將這些部分視作新的第二類女生(s = 2 ^ i , v = 原本的 v ÷ s × 2 ^ i),然後套用原本的 01 背包解法即可。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作