題意
有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就是最優解。由於是順序放球,每根柱子上的球滿足這樣的特徵,即下面的球編號小於上面球的編號。抽象成圖論...