網路流 24 題 4 魔術球

2021-08-19 14:30:31 字數 1403 閱讀 2131

題意

有n根柱子可以放球,球上的權值從1向後標。要求這n根柱子滿足

任意一根柱子上相鄰兩個球的和是乙個完全平方數

小的球在下面,大的球在上面

輸出最多放多少個球,和其中的一種方案。

分析

[第一想法是打表,是不是沒救了]

然後首先就是考慮到了二分...然而範圍十分神奇...可以說是猜出來的。

然後就是考慮把一些球連在一起,然後就變成了之前的最小路徑覆蓋,然後二分也很高效,完全沒有問題。

然後輸出的時候也就是一行輸出來

[完全沒看題解的完成了這道題呢x]

code

#include#define inf 100000000

#define m 4005

using namespace std;

void read(int &x)

struct ede[m*m];

int nx[m],ecnt;

void add(int x,int y,int cap);

nx[x]=ecnt++;

e[ecnt]=(ed);

nx[y]=ecnt++;

}bool mark[m];

int to[m],m;

struct dinic

} return level[t]>0;

} int dfs(int x,int f)

e[i].cap-=d;

e[i^1].cap+=d;

sum+=d;

if (sum==f)return f;

} if (!sum)level[x]=0;

return sum;

} int solve(int s,int t)

return sum;

}}dinic;

bool chk(int a)

int n;

bool chk()

} }

int res=m-dinic.solve(0,2*m+1);

return res<=n;

}void pt()

} }memset(to,0,sizeof(to));

memset(mark,0,sizeof(mark));

dinic.solve(0,2*m+1);

for (i=1;i<=m;i++)if (!mark[i])

printf("\n"); }}

int main()

else r=m-1;

} printf("%d\n",res);

m=res;

pt();

return 0;

}

網路流 24 題 魔術球

假設有 n n n 根柱子,現要按下述規則在這 n n n 根柱子中依次放入編號為 1,2,3,4,1,2,3,4,cdots 1,2,3,4,的球。每次只能在某根柱子的最上面放球。在同一根柱子中,任何 2 2 2 個相鄰球的編號之和為完全平方數。試設計乙個演算法,計算出在 n n n 根柱子上最多...

網路流24題 4 魔術球問題 題解

題目鏈結 洛谷 p2765 假設有 n 根柱子,現要按下述規則在這 n 根柱子中依次放入編號為 1,2,3,cdots 的球 試設計乙個演算法,計算出在 n 根柱子上最多能放多少個球。例如,在 4 根柱子上最多可放 11 個球。對於給定的 n 計算在 n 根柱子上最多能放多少個球。對於這道題,我很自...

網路流24題 魔術球問題

列舉答案轉化為判定性問題,然後最小路徑覆蓋,可以轉化成二分圖最大匹配,從而用最大流解決。列舉答案a,在圖中建立節點1.a。如果對於i具體方法可以順序列舉a的值,當最小路徑覆蓋數剛好大於n時終止,a 1就是最優解。由於是順序放球,每根柱子上的球滿足這樣的特徵,即下面的球編號小於上面球的編號。抽象成圖論...