問題描述:假設有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就是最優解。由於是順序放球,每根柱子上的球滿足這樣的特徵,即下面的球編號小於上面球的編號。抽象成圖論...