拔河比賽 CODEVS1959 解題報告

2021-06-26 20:37:19 字數 471 閱讀 9574

題面:將n個數分成兩部分,使其個數之差不超過1,且兩部分和之差最小。n<=100,

思路:由於觀察到ai很小,所以很容易就想到的乙個思路是以數的大小和個數作二維費用布林揹包,求其當個數為n>>1時最接近的解。

這是我很早就想到了的,但這道題還是做了很久,因為算下時間複雜度的話可以發現是

所以我就想呀想,想呀想。。花了很久很久。。但是實在想不出更好的做法了。。

所以我就對自己說,誒,實在沒辦法了,就寫個超時演算法試試吧,萬一評測機略牛呢。。

結果我寫的時候——突然就發現了!

乙個優化:

其實我們迴圈費用的時候,根本沒必要迴圈到底,只需要迴圈到

總結:我們在設計演算法的時候,當發現設計出了10^8的演算法時,不要灰心、不要輕言放棄,要想一想是否常數夠小?是否能在常數上做一些優化。輕言放棄是不可取的。

CODEVS 1959 拔河比賽

原題鏈結 看臉的時候到了 隨機化!重複!dp的flag倒下了!夏天沒有西瓜!總之有非常看臉的隨機做法 也有非常靠譜的dp做法 dp是bool型 判斷前i個人裡選j個能不能達到k 隨機化 include include include include include include include i...

Codevs 1959 拔河比賽

有兩種做法 第一種 dp 不過這個dp比較難想,而且比較特別,解釋見 注釋。include include include include using namespace std int n,sum,k,a 105 bool f 105 45005 int main printf d d min a...

codevs1959 拔河比賽

題目大意 給定乙個有 n 個數的集合,將這 n 個數均分成兩堆,求差值最小是多少。題解 有關集合選數的問題,應該是揹包問題,同時要求均分可知,選出的物品數目也應該是揹包費用的乙個維度,因此這是乙個多維費用揹包問題。設狀態 dp i j k 表示考慮了前 i 個數字,已經選了 j 個數字,數字之和為 ...