P1103 書本整理

2022-06-20 06:00:12 字數 1470 閱讀 4965

frank是乙個非常喜愛整潔的人。他有一大堆書和乙個書架,想要把書放在書架上。書架可以放下所有的書,所以frank首先將書按高度順序排列在書架上。但是frank發現,由於很多書的寬度不同,所以書看起來還是非常不整齊。於是他決定從中拿掉k本書,使得書架可以看起來整齊一點。

書架的不整齊度是這樣定義的:每兩本書寬度的差的絕對值的和。例如有4本書:

1 \times 21×2

5 \times 35×3

2 \times 42×4

3 \times 13×1

那麼frank將其排列整齊後是:

1 \times 21×2

2 \times 42×4

3 \times 13×1

5 \times 35×3

不整齊度就是2+3+2=72+3+2=7

已知每本書的高度都不一樣,請你求出去掉k本書後的最小的不整齊度。

第一行兩個數字nn和kk,代表書有幾本,從中去掉幾本。(1 \le n \le 100, 1 \le k1≤n≤100,1≤k下面的nn行,每行兩個數字表示一本書的高度和寬度,均小於200200。

保證高度不重複

一行乙個整數,表示書架的最小不整齊度。

輸入 #1複製

4 1

1 22 4

3 15 3

輸出 #1複製

3

題目分析:

對於一列書,如果我們直接按照題目模擬,會發現過程比較困難,因為如果抽出一本書,就要計算與之相鄰的兩本書之間的差以及這本書與他相鄰元素的絕對值的差,不好模擬,所以我們考慮倒敘存入,從這些書中選擇一本書依次插入佇列。兩種情況:

一、自己是對頭,對於答案的貢獻是0

二、從已經選擇過的書的後面插入,對於答案的貢獻就是當前書與選擇插入的書的絕對值的差

迴圈判斷即可。

ac**:

#includeusing

namespace

std;

int f[302][302

];int

n,m;

struct

nodev[

502];

bool

cmp(node a,node b)

intmain()

sort(v+1,v+1+n,cmp);

memset(f,

0x3f,sizeof

(f));

for(int i=1;i<=n;i++) f[i][1]=0

;

for(int i=2;i<=n;i++)}}

int ans=99999

;

for(int i=m;i<=n;i++)

cout

<'\n'

;

return0;

}

P1103 書本整理

題意 給出n本書 每本書有高度和寬度,題意讓我們先講高度排序 保證每一本書的高度不同,從大從小排對答案不影響 相鄰的書的寬度差的絕對值為貢獻,讓我們去掉其中k本書,求最小貢獻 思路 去掉書的想法很難實現,我們逆向思維,在其中增加n k本書 那我們設定乙個dp i j 表示第i本書前面的所有書 包括第...

P1103 書本整理 dp

frank是乙個非常喜愛整潔的人。他有一大堆書和乙個書架,想要把書放在書架上。書架可以放下所有的書,所以frank首先將書按高度順序排列在書架上。但是frank發現,由於很多書的寬度不同,所以書看起來還是非常不整齊。於是他決定從中拿掉k本書,使得書架可以看起來整齊一點。書架的不整齊度是這樣定義的 每...

題解 P1103 書本整理

一道很好的dp入門題,適合像我這種學了大半年卻還不會dp的人。首先,題目要求我們將書本按照高度排序,在這裡我們可以用結構體實現。其次才是重點,推dp方程。題目中說抽走k本書,我們不妨轉換一下 從n本書中留下 n k 本。然後,尋找每本書之間的關係 對於第一本書,如果留下,花費顯然只能是0。對於第二本...