網路流24題 4 魔術球問題 題解

2022-06-29 16:15:07 字數 2197 閱讀 9760

題目鏈結(洛谷 p2765)

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

試設計乙個演算法,計算出在\(n\)根柱子上最多能放多少個球。例如,在\(4\)根柱子上最多可放\(11\)個球。對於給定的\(n\),計算在\(n\)根柱子上最多能放多少個球。

對於這道題,我很自然地想到了乙個貪心策略。首先,很容易發現,這道題柱子的編號其實根本不重要。那麼,我們規定,相同條件下放球時,優先放入編號小的柱子。

當我們放入第\(k\)個球時,我們採用如下貪心策略:

若乙個球既可以放入某個有球的柱子,也可以放入某個無球的柱子,那麼,放入有球的柱子一定更優。因為將\(k\)放入有球的柱子,會出現乙個頂端為\(k\)的柱子和乙個空柱子(就是沒放進去的那個),而放入空柱子則會出現乙個頂端為\(k\)的柱子和乙個能與\(k\)匹配的柱子,顯然前者比後者更優。

不會出現乙個數放入兩個已經有球的柱子的情況。因為投入球的順序一定是從\(1\)到\(n\)逐個遞增的,按照上述投入球的規則,最大的若干個球一定都在各個最外側,而且它們的數一定是連續的。(可以按照上述規則手推一下\(n = 4\)的情況)

其實個人感覺歸為網路流不是很合適,因為把本題抽象成圖的做法,本質上是做二分圖匹配。關於圖的點數的通項,並不是我自己想出來的,也無法給出詳細的證明,所以建議優先參考貪心做法。

給出結論:若一共有\(n\)個柱子,則總共能放入\(\left\lfloor \dfrac \right\rfloor\)個球。

然後,我們很容易想到,我們盡可能把臨近的能組成完全平方數的數穿起來,比如\(1 \rightarrow 3 \rightarrow 6\),那麼,乙個這樣的串上的數就能都放到乙個柱子上。同時,我們希望這樣的串盡可能少。

有沒有覺得很熟悉?希望串盡可能少,剩下的部分就和第三題最小路徑覆蓋問題一樣了。

然後,我們能推算出一共有多少球,這樣,我們就能構圖了,剩下的就同第三題——最小路徑覆蓋問題一樣了。

/**

* luogu p2765

* 貪心

**/#include #include #include #include #include using namespace std;

const int maxn = 10000;

vectors[maxn];

int n, ans, d;

int check(const int &x)

return 0;

}int main()

printf("%d\n", ans);

for (int i = 1; i <= n; i++)

return 0;

}

/**

* luogu p2765

* 網路流

**/#include #include #include #include using namespace std;

const int maxn = 5000;

const int maxm = 1e5 + 5;

const int inf = 0x3f3f3f3f;

const int s = 0;

const int t = maxn - 1;

struct edge e[maxm];

int numedge, head[maxn], n, pre[maxn], nxt[maxn], depth[maxn];

bool ispfs[maxn];

inline void addedge(int from, int to, int val)

inline bool bfs() }}

return depth[t] != 0;

}inline int dfs(int u, int flow)

e[i].val -= di;

e[i ^ 1].val += di;

return di;}}

}return 0;

}int dinic()

}return res;

}int main() }}

for (int i = 1; i <= n; i++)

dinic();

printf("%d\n", n);

for (int i = 1; i <= n; i++)

}return 0;

}

網路流 24 題 4 魔術球

題意 有n根柱子可以放球,球上的權值從1向後標。要求這n根柱子滿足 任意一根柱子上相鄰兩個球的和是乙個完全平方數 小的球在下面,大的球在上面 輸出最多放多少個球,和其中的一種方案。分析 第一想法是打表,是不是沒救了 然後首先就是考慮到了二分.然而範圍十分神奇.可以說是猜出來的。然後就是考慮把一些球連...

網路流24題 魔術球問題

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

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

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