魔術球問題 網路流24題

2022-08-01 17:48:13 字數 981 閱讀 2197

假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,...的球。

(1)每次只能在某根柱子的最上面放球。

(2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。

試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。

«程式設計任務:

對於給定的n,計算在n根柱子上最多能放多少個球。

4<=n<=55

考慮到當球的數量增加時柱子數量不嚴格單增,所以可以乙個乙個加球判定需要幾個柱子裝得下。

把每個球拆成兩個點,互成平方數的兩個球左右連邊,為了確保只連一次從大的向小的連邊。

那麼問題就變成了最小路徑覆蓋,路徑數就是柱子數。

列舉球為m個,當路徑數大於柱子數時答案就是m-1,至於輸出方案就從1遍歷路徑就好了。

為了不超時,我們新加乙個球,就從這個球跑一次增廣路即可,這也是為什麼從大的往小的連邊。

#includeusing

namespace

std;

const

int maxn=3605

;int

n,m;

intvis[maxn],match[maxn],timer;

bool square[maxn<<1

];vector

e[maxn];

void

init()

bool dfs(int

u) }

return

false;}

void

get(int

u)

get(match[u+1800

]);}

void

print()

intmain()

}}

view code

還有貪心的方法,有可以放的柱子就放,不然就新開(正確性就不知道了)。

貌似球的數量還有規律2+2+4+4+6+6+....

網路流24題 魔術球問題

列舉答案轉化為判定性問題,然後最小路徑覆蓋,可以轉化成二分圖最大匹配,從而用最大流解決。列舉答案a,在圖中建立節點1.a。如果對於i具體方法可以順序列舉a的值,當最小路徑覆蓋數剛好大於n時終止,a 1就是最優解。由於是順序放球,每根柱子上的球滿足這樣的特徵,即下面的球編號小於上面球的編號。抽象成圖論...

魔術球問題(網路流24題)

假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,的球。1 每次只能在某根柱子的最上面放球。2 在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。對於給定的n,計算在n根柱子上最多能...

網路流24題 魔術球問題

以珠子為點,滿足條件就兩兩連邊 那麼就是讓你求n條路徑最多能覆蓋多少節點。眾所周知,最小邊覆蓋 點總數 最大匹配 不會看這裡link 於是拆點跑二分圖即可 大概就是s向x連邊 滿足條件的點k向x 連邊 x 向t連邊 有兩種方式 1.我們輪流加點,每次在殘量網路跑最大流就可以了 2.我們二分答案,每次...