做了spfa求平均值最小的環的問題,剛意識到「原來這是01分數規劃啊」,就在這裡並不對勁地說分數規劃問題了。
01分數規劃解決的是哪一種問題呢?有兩個大小一樣的陣列a[1...n]和b[1...n],要求出陣列q[1...k],使( a[q[1]] + a[q[2]] + ... + a[q[3]]) / ( b[q[1]] + b[q[2]] + ... + b[q[3]] )最大。
有一種聽上去很靠譜的貪心做法:把所有位置i按照a[i]/b[i]排序,取最靠前的k個。
這樣如果a[1...n]和b[1...n]全是正數就沒什麼問題,但是要是有的是負數呢?想必是會出錯的,因為如果對於位置i,a[i]正b[i]負,(a[i]/b[i])就是個負數,會排在靠後的位置,但是b[i]為負,會使分母減少,如果分母減b[i]為正的話反而該選b[i]。要是考慮了這種情況,又要考慮選了太多負數導致最後算出的分數是負數的情況、分母和分子都是負數使得答案負負得正的情況…聽上去很麻煩,不可做。
但是會發現當存在x≤( a[q[1]] + ... + a[q[k]]) / ( b[q[1]] + ... + b[q[k]])時,對於x'那該怎麼判斷是否存在q[1...k]使得x ≤ ( a[q[1]] + ... + a[q[k]]) / ( b[q[1]] + ... + b[q[k]])呢?稍微變一下形。
x * ( b[q[1]] + ... + b[q[k]]) ≤ ( a[q[1]] + ... + a[q[k]])
0 ≤ ( a[q[1]] + ... + a[q[k]]) - x * ( b[q[1]] + ... + b[q[k]])
0 ≤ ( a[q[1]] - x * b[q[1]]) + ... + (a[q[k]] - x * b[q[k]])
這看上去就很好判斷了。
分數規劃問題想必是不可能這麼簡單的,可能還會有其他奇怪的限制(不是只限制個數k),或者是每個數可以取多個。據說分數規劃題的難度不在分數規劃上?
並不對勁的splay
splay和不加任何旋轉一定會被卡的二叉搜尋樹的唯一區別就是每次操作把當前節點旋轉到根。旋轉有各種zig zag的組合方式,感覺很麻煩,並不對勁的人並不想講。其實可以找出一些共性將它們合併。設ls a 點a是其父親的左兒子 son a 0 a的左兒子,son a 1 a的右兒子,fa a a的父親。...
並不對勁的方格取數問題
在乙個有 m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任意 2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。對於給定的方格棋盤,按照取數要求程式設計找出總和最大的數。輸入格式 第 1 行有 2 個正整數 m 和 n,分別表示棋盤的行數和列數。...
並不對勁的費用流
最小費用最大流肯定要保證最大流,所以它和最大流有一些類似的性質。如果把費用看成邊,就可以每次走最短路 保證費用最小 走到不能走為止 保證最大流 費用流版的ek就是這樣。需要注意的是,反向弧的邊權為它對應的正向弧的費用的相反數,所以最短路要用spfa來求。費用流版的dinic,又叫zkw費用流,還是多...