假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為 1,2,3,4......的球。
(1)每次只能在某根柱子的最上面放球。
(2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。
試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可
放11個球。
´程式設計任務:
對於給定的n,計算在 n根柱子上最多能放多少個球。
第1 行有 1個正整數n,表示柱子數。
第一行是球數。
樣例方案如下
1 8
2 7 9
3 6 10
4 5 11
每一行表示乙個柱子上的球
n<=60 保證答案小於1600
正解:網路流
解題報告:乙個點最多上面有乙個點,下面有乙個點,然後我們就可以由此把圖構出來,把乙個點拆成兩個點,分別管上和下,分別連源點與匯點,把與源點和匯點連的邊容量定為1,是完全平方數的再連一條邊,然後跑出的最大流就是有多少個可以接在上面,然後用當前的點數減去最大流,就是要用的柱子數,然後動態加點,當要用的柱子數超過n時,上一次的點數就是最多能放的球。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include9#define min(a,b) a10
#define rg register
11const
int n = 100000;12
const
int m = 30000;13
const
int inf = 2147483641;14
15using
namespace
std;
1617
intgi()
2324
struct
datenn[n];
2728
int s,t,m=m,head[n],nxt[n],f[n],dis[n],cnt=1;29
30void link(int l,int
r),nxt[cnt]=head[l],head[l]=cnt;
32 nn[++cnt]=(date),nxt[cnt]=head[r],head[r]=cnt;
33return;34
}3536int
bfs()
48return0;
49}5051
int dinic(int xh,int
sum)
60if (s==0) dis[xh]=-1;61
return
s;62}63
64int
main()
77 printf("
%d",xh-1
);78
return0;
79 }
網路流24題 魔術球問題
列舉答案轉化為判定性問題,然後最小路徑覆蓋,可以轉化成二分圖最大匹配,從而用最大流解決。列舉答案a,在圖中建立節點1.a。如果對於i具體方法可以順序列舉a的值,當最小路徑覆蓋數剛好大於n時終止,a 1就是最優解。由於是順序放球,每根柱子上的球滿足這樣的特徵,即下面的球編號小於上面球的編號。抽象成圖論...
魔術球問題(網路流24題)
假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,的球。1 每次只能在某根柱子的最上面放球。2 在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。對於給定的n,計算在n根柱子上最多能...
網路流24題 魔術球問題
以珠子為點,滿足條件就兩兩連邊 那麼就是讓你求n條路徑最多能覆蓋多少節點。眾所周知,最小邊覆蓋 點總數 最大匹配 不會看這裡link 於是拆點跑二分圖即可 大概就是s向x連邊 滿足條件的點k向x 連邊 x 向t連邊 有兩種方式 1.我們輪流加點,每次在殘量網路跑最大流就可以了 2.我們二分答案,每次...