網路流24題 魔術球問題(簡化版

2021-08-04 16:22:52 字數 1399 閱讀 3047

問題描述: 

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

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

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

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

放11個球。 

´程式設計任務: 

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

´資料輸入: 

檔案第1 行有 1個正整數n,表示柱子數。 

´結果輸出: 

檔案的第一行是球數。

資料規模

n<=60  保證答案小於1600

輸入檔案示例

4輸出檔案示例

11方案如下

1 8 

2 7 9 

3 6 10 

4 5 11

每一行表示乙個柱子上的球

在上一次的殘餘網路建新邊-》(由於從[1~...]按順序+反向邊)-》得新的流
就是編號較小的頂點向編號較大的頂點連線邊(皆可),條件是兩個球可以相鄰,即編號之和為完全平方數。每根柱子看做一條路徑,n根柱子要覆蓋掉所有點,乙個解就是乙個路徑覆蓋。

最小路徑覆蓋數隨球的數量遞增不遞減,滿足單調性

,所以可以

列舉答案(或二分答案)

,對於特定的答案求出最小路徑覆蓋數,乙個可行解就是

最小路徑覆蓋數等於n的答案

,求出最大的可行解就是最優解。本問題更適合列舉答案而不是二分答案,因為如果順序列舉答案,每次只需要在殘量網路上增加新的節點和邊,再增廣一次即可。如果二分答案,就需要每次重新建圖,大大增加了時間複雜度。

#include#include#include#include#include#include#include#include#define v 10605

#define mod 1000000007

#define ll long long

using namespace std;

int n,m,t,s;

int ls[v],pre[v],dep[v],q[v];

struct da

edge[v*15];

int head[v],tot,ans,s;

inline void add(int x,int y,int zz)

bool bfs() }}

}if(sd==1)break;

//cout<<" er"<}

*/return 0;

}int gg=haha();

int main()

網路流24題 魔術球問題(簡化版

輸入檔案 balla.in輸出檔案 balla.out簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為 1,2,3,4.的球。1 每次只能在某根柱子的最上面放球。2 在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。試設計...

cogs 魔術球問題 簡化版

網路流24題 魔術球問題 簡化版 輸入檔案 balla.in 輸出檔案 balla.out 簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為 1,2,3,4 的球。1 每次只能在某根柱子的最上面放球。2 在同一根柱子中,任何2...

網路流24題 魔術球問題

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