假設有
n 根柱子,現要按下述規則在這
n根柱子中依次放入編號為 1,
2,3,
… 的球。
(1)每次只能在某根柱子的最上面放球。
(2)在同一根柱子中,任何
2 個相鄰球的編號之和為完全平方數。
試設計乙個演算法,計算出在
n根柱子上最多能放多少個球。例如,在
4 根柱子上最多可
放 11
個球。輸入檔案第
1 行有
1個正整數
n ,表示柱子數。
程式執行結束時,將
n根柱子上最多能放的球數以及相應的放置方案輸出。
檔案的第一行是球數。
接下來的
n 行,每行是一根柱子上的球的編號。
11每根柱子互不干擾,可以把每根柱子看成一條路徑——這不就成了最小路徑覆蓋問題了嗎???1 8
2 7 9
3 6 10
4 5 11
將相加為完全平方數的兩個數連一條邊,求解最小路徑覆蓋問題就可以解決 n0
個球最少需要多少根柱子的問題。
然後依次列舉 n0
,直到所需柱子的個數大於
n ,即可得出答案(這裡用列舉的原因是,每次不需要重新求解最大流)。
還有一種貪心的方法。
現在如果有
t個柱子,要放數
i ,從第乙個柱子開始試,試到能放的那個柱子,就把
i放進去,如果
t 個柱子都不行,就再多增加乙個柱子放 i。
易知,這樣得出的答案為 f(
n)=
bool bfs()
} return dis[t]>0;
} int dfs(int now,int flow)
} }
return 0;
} void dfs2(int now)
} int work(int front)
for(int i=1;iif(he[i+front])add(i,front+2000,1);
} add(s,front,1);add(front+2000,t,1);
while(bfs())
} return weight;
} void work2(int front)
while(bfs())
} int main()
printf(」%d\n」,ll-1);
work2(ll-1);
for(int i=1;iif(!vis[i])
return 0;
}
網路流二十四題之三 魔術球問題
先來說下怎麼建模。其實就是經典的拆點模型 1.將乙個數拆成兩個點集x0,x1。2.將x0連線至源點,x1連線至匯點 3.如果對於乙個數i要是想直接求解有點麻煩,所以可以列舉答案。每次新新增進來乙個數,然後直接在殘量網路上跑最大流就行,一旦匹配數達到n 1,也就是剛好完成了n個柱子,此時跳出就行 in...
網路流二十四題
開始了我的網路流 24 題之旅,寫在一起到時候方便一起複習哦。其實這並不是真的二十四題,有一些過於水的我就不寫上來了。然後有的 太水了就不寫了。感覺這些題目還是比較基礎的,方法卻值得借鑑!剩餘題目 航空路線問題 火星探險問題以下 題目描述 點此看題 解法 你發現時間是最大的障礙,因為對於不同的時間飛...
網路流二十四題之航空路線問題
這道題的建模很有意思 1.首先每個點,除了起點,都向拆點後的點練一天容量1,費用 1的邊,代表只能走一次,負費用是為了求最大的費用,也就是最多的經過點。對於起點,容量變成2,費用不變。2.其次對於一天航線,終點在拆點後的點集向起點連一條邊,容量無限,費用為0,代表兩個城市可以達到。之後一次費用流,如...