AC日記 魔術球問題 洛谷 P2765

2022-05-14 07:20:42 字數 1840 閱讀 1799

«問題描述:

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

思路:因為有資料範圍,我們採取二分答案(列舉);

然後,走最大流,當當前球數減去最大流數==n+1時,當前球數-1就是答案;

來,上**:

#include #include 

#include

#include

#include

#include

#define maxn 4000

using

namespace

std;

struct

edgetype ;

struct edgetype edge[3000005

];int

if_z,n,mid,l,r,cnt,head[maxn],ans;

int s=0,t=maxn-1

,deep[maxn],next[maxn];

bool

if_[maxn];

char

cget;

inline

void

in(int &now)

while(cget>='

0'&&cget<='9'

)

now*=if_z;

}inline

void edge_add(int u,int v,int

w)bool

bfs()}}

return

false;}

int flowing(int now,int

flow)

flow-=pos;

oldflow+=pos;

edge[i].flow-=pos;

edge[i^1].flow+=pos;

if(flow==0) return

oldflow;

}return

oldflow;

}bool

check()

}for(int i=1;i<=mid;i++)

int pos=mid;

while(bfs()) pos-=flowing(s,0x7ffffff

);

if(pos>n) return

true

;

else

return

false;}

intmain()

mid=ans-1

; check();

printf(

"%d\n

",mid);

for(int i=1;i)

printf("\n

");}

return0;

}

洛谷P2765 魔術球問題

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

洛谷 P2765 魔術球問題

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

洛谷 P2765 魔術球問題

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