«問題描述:
假設有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
思路:因為有資料範圍,我們採取二分答案(列舉);
然後,走最大流,當當前球數減去最大流數==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...