P2765 魔術球問題

2021-10-02 10:00:11 字數 1670 閱讀 9439

題目描述

«問題描述:

假設有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...