2018年3月5日

UVa10271 chopsticks

一個很莫名其妙(?,卻也很有趣的題目

連結:UVa10271 chopsticks

題目:

在中國,人們用筷子來夾取食物吃,而劉先生家是個特例
他喜歡一個人發3支筷子,其中最長的用來當叉子

剩下兩支的長度希望能愈相近愈好,畢竟他們要湊成一雙筷子
而叉子的長度並不重要,只要確保他是3支裏頭最長的就好

這兩支較短的長度若分別是A, B,則會帶來(A-B)^2的不良感
今天有K+8個人,和至少3*K+24支筷子,請你找出最佳分發筷子的方法,使所有人得到的不良感總和最少

做法:

題目給的長度是已排序的
可以發現到,若要保持長度差平方盡量小,第i支筷子不是跟第i-1支就是跟第i+1支一組

但難點在於怎麼留下一支較長的筷子
如果從小開始取,則遇到的筷子是愈來愈長的,難以直接判定有沒有足夠多的"長筷子"當叉子

所以,換個邊,從最長的往最短的取,發現如果我們要取當前的筷子,只要前面三三一組後還有剩,就可以拿來當作叉子,畢竟剛剛那些都是比較長的,就可以列出轉移式

dp[i][j] = 前j支筷子分給i個人的最少不良感總和
if (j-2)-3*(i-1) <= 0 前面沒有多餘的筷子
    dp[i][j] = dp[i][j-1]  沒辦法取
else
    dp[i][j] = min(dp[i][j-1], dp[i-1][j-2]+(a[j-1]-a[j])^2)  看取或不取哪個划算

code:

沒有留言:

張貼留言