«問題描述:
假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,...的球。
(1)每次只能在某根柱子的最上面放球。
(2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。
試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。
«程式設計任務:
對於給定的n,計算在n根柱子上最多能放多少個球。
輸入格式:
第1 行有1個正整數n,表示柱子數。
輸出格式:
程式執行結束時,將n 根柱子上最多能放的球數以及相應的放置方案輸出。檔案的第一行是球數。接下來的n行,每行是一根柱子上的球的編號。
輸入樣例#1:
4
輸出樣例#1:
111 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 個球。程式設計任務 對...