洛谷P2765 魔術球問題

2021-08-15 15:39:51 字數 1469 閱讀 1929

«問題描述:

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

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

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

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

«程式設計任務:

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

輸入格式:

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

輸出格式:

程式執行結束時,將n 根柱子上最多能放的球數以及相應的放置方案輸出。檔案的第一行是球數。接下來的n行,每行是一根柱子上的球的編號。

輸入樣例#1:

4

輸出樣例#1:

11

1 82 7 9

3 6 10

4 5 11

感謝 @phoenixeclipse 提供spj

4<=n<=55

我們先列舉球,乙個個加到圖里

並在加邊的過程是三個操作:

當然不可缺少的是拆點把乙個球x拆成x和x'

下一步x連源點,x'連匯點都是容量為一的有向邊

第三步是找這個數可以與那個數組成完全平方數,假設這個數為y,則y向x'連邊

下面就是跑最大流了,在跑最大流的時候記錄一下這個點增廣出來的點。

注:此題還可以用 匈牙利演算法 做,但由於這題是 網路流24題 之一,於是用了 dinic 。

附**:

#include#include#include#include#include#include#define maxn 10010

#define max 999999999

using namespace std;

int n,s,t,c=2;

int head[maxn],deep[maxn],real[maxn],fa[maxn<<1];

bool used[maxn<<1];

struct nodea[(maxn/10*maxn/10)<<1];

inline int read()

while(c>='0'&&c<='9')

return date*w;

}inline void add(int u,int v,int w)

bool bfs()

} }return false;

}int dfs(int x,int limit)

else deep[v]=-1;

} }return cost;

}int dinic()

int main()

printf("%d\n",now-1);

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

if(!used[real[i]])

printf("\n");

} return 0;

}

洛谷 P2765 魔術球問題

有n個柱子,編號為1,2 的小環,要將它們依次套在環上,要求直接接觸的兩小球的和為完全平方數,那麼最多可以套幾個小球。首先可以貪心,如果可以套在其他小球上,則套在其他小球上,反之,套在柱子上,直到沒有多餘柱子,可以證明這是對的,但我覺得還是網路流的做法比較重要。因為要依次取小球,那麼當答案為ans時...

洛谷 P2765 魔術球問題

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

P2765 魔術球問題

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