2015南陽CCPC D 金磚 解題報告

2022-04-29 21:15:11 字數 1250 閱讀 5448

有乙個長度為l的板凳,可以放一排金磚,金磚不能重疊。特別的,擺放的金磚可以超出板凳,前提是必須保證該金磚不會掉下去,即該金磚的重心必須在板凳上。

每塊金磚都乙個長度和價值,且金磚是規則的長方體。請計算最多可以擺放多少價值的金磚。

第一行,兩個整數n和l,分別表示金磚的數量和板凳的長度。

接下來n行,每行兩個整數,ai和vi,分別表示第i塊金磚的長度和價值。

一行,乙個整數,表示最大價值。

3 7

4 12 1

8 1

2
3 5

4 12 2

8 9

11
1 1

10 3

3

要做這道題,得先掌握揹包的一般思路,這裡就不細講了。

先說下思路。

at first,處理奇數長度的情況(沒考慮清楚會wa乙個點),因為對於奇數長度金磚,重心位置會出現小數的情況,這就讓人很難堪。不過,可以把所有相關長度都乘2,或理解為以0.5為單位長度,這樣就不用管奇數長度的情況了。

secondly,咋處理能長出板凳的情況???直接按題目思路不好考慮,就把它轉換一下吧。首先,我們很容易得知,最邊上的兩塊要最靠邊,及剛好不掉下去,這樣可以騰出更大的空間給放在中間的金磚s。然後呢?有些人可能會想預處理出所有不超過板凳長度能放多少價值,再列舉兩邊的金磚,最後取最大值。however,重複取金磚的情況怎麼考慮???其實我們可以當做最靠邊的金磚長度打五折,或者說有兩個金磚長度折半,具體實現就是把f陣列再開一維記錄已經取了幾個「半價「金磚,最後取最大值即可。

finally,還要考慮長度遠大於l的金磚(更嚴謹地說,就是指長度 > 2 * l的金磚),它們即使「半價」處理也無法放上板凳,但是實際上可以把金磚的重心剛好放在板凳上,兩邊儘管長出去。好在這種情況會使金磚獨佔板凳,所以說直接用v來更新ans的值。

具體實現就在下面啦:

#includeusing namespace std;

#define maxn 4005

#define ll long long

int n, l;

ll f[maxn];

int main()}}

printf( "%lld", ans );

return 0;

}

撒花!(剛好下課)

PKU Campus 2015解題報告

這是第一次參加北大校賽,有一段時間沒有好好做題了,加上自己太水,這場比賽做得很不好,場下仔細想了想沒搞定的題目,其實沒有想象中那麼難 下次北大校賽,一定要好好打!因為平時實驗室有不少事情要做,沒辦法將時間全花在做題上面,只能慢慢啃這一套題,同時將我的解決思路總結在這篇部落格當中。a wu xing ...

NOIP2015解題報告

day1.當時的zxn很弱,弱到連dfs都調不明白就開始去noip。現在他會了dfs,二分答案,求lca,bfs,拓撲排序。所以他回去填noip2015的題解坑。t1.我現在依然不知道除了這種尾遞迴式的寫法之外還有啥別的寫法 偽 void dfs int i,int j,int x 咳我好像現在明白...

解題報告 luogu P2015

其實就是這題的雙倍經驗啦。動態轉移方程是 f i j max f i j f i i k 1 f i k e i w 這裡 f i j 代表從以 i 為根的子樹中合法留 j 個樹枝的最大剩餘值。include include includeconst int maxn 105 using names...