題目描述
«問題描述:
假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,…的球。
(1)每次只能在某根柱子的最上面放球。
(2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。
試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。
«程式設計任務:
對於給定的n,計算在n根柱子上最多能放多少個球。
輸入格式
第1 行有1個正整數n,表示柱子數。
輸出格式
程式執行結束時,將n 根柱子上最多能放的球數以及相應的放置方案輸出。檔案的第一行是球數。接下來的n行,每行是一根柱子上的球的編號。
題解:按照完全平方數建圖,列舉當前加的點,然後向殘餘網路種加邊和加點,如果跑出來是有流量的,說明這個球被放在了已有的柱子上,否則乙個增加乙個柱子單獨放。
因為每個球只能用一次,所以將球分成入點和出點,入點連線超級源點,出點連線超級匯點,至於完全平方數j
j< i 且 i+j i+ji+ j為完全平方數就讓i的入點連線j的出點即可 ac**:#pragma gcc optimize(2)
#include
#include
using
namespace std;
using
namespace __gnu_cxx;
#define ll long long
const
int maxn =
1e5+50;
const
int mod =
1e9+7;
const
int inf =
0x3f3f3f3f
;int n,base=
5000
,s,t,st,tot=
1,ans;
int head[maxn]
,to[maxn]
,w[maxn]
,nxt[maxn]
,h[maxn]
,v[maxn]
,vis[maxn]
;inline
void
ade(
int u,
int v,
int ww)
inline
void
add(
int u,
int v,
int w)
inline
intbfs()
}}return h[t];}
inline
intdfs
(int x,
int f)}if
(!fl) h[x]=-
1;return fl;
}inline
intdinic()
inline
void
solve()
}for
(int i=
1;i)puts(""
);}}
signed
main()
printf
("%d\n"
,st-1)
;solve()
;return0;
}
P2765 魔術球問題
p2765 魔術球問題 貪心模擬就可以過.好像和dinic沒啥關係 找找規律發現可以貪心放。n又灰常小。設答案 m 你可以 o mn 直接模擬過去 閒的慌得話可以像我用個 set 維護 複雜度可以降為 o mlogn 網路流.不會寫 逃 口胡一下dinic 乙個點 u 拆成2個表示 1.放在柱子最下...
P2765 魔術球問題
每個數可以放在和它和是平方的數上面 我們可以想到,如果乙個點可以放在某個點上面是那個點向它連邊 如果乙個點向它所有能連的點連邊,那麼它的最小鏈覆蓋就是我們要找的答案 經過簡單推理可以發現,每個點可以連線的點的大小是遞增的,那麼把編號小的點放在柱子下面一定更優 這樣連邊就行了 include incl...
洛谷P2765 魔術球問題
問題描述 假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,的球。1 每次只能在某根柱子的最上面放球。2 在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。程式設計任務 對於給定的n...