luogu P2765 魔术球问题】的更多相关文章

大意:给定n根柱子, 依次放入1,2,3,...的球, 同一根柱子相邻两个球和为完全平方数, 求最多放多少个球. 对和为平方数的点连边, 就相当于求DAG上最小路径覆盖. #include <iostream> #include <sstream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <map> #…
题目中没有说球的上限是多少,只告诉了柱子,那么我们就应该以柱子为界去增加球,考虑将每两个能组成完全平方数的点连边,就形成了一个DAG(有向无环图),由于是DAG,可以转换为最小覆盖问题,即最多有n条路径(柱子数),求其能覆盖的最大点数,最小覆盖路径 = 节点数 - 最大匹配数,可以将其拆成二分图跑匈牙利/最大流,由Hall定理,|S| <= |T|,此处的|S|就等于节点数-最大匹配数,而|T|等于最小覆盖路径,就是柱子数n(n个路径必有n个节点),在满足条件的情况下增加球的数量即可. 在求最小…
P2765 魔术球问题 贪心模拟就可以过.........好像和dinic没啥关系   找找规律发现可以贪心放.n又灰常小. 设答案=m 你可以$O(mn)$直接模拟过去 闲的慌得话可以像我用个$set$维护 复杂度可以降为$O(mlogn)$ 网络流.....不会写(逃   口胡一下dinic 一个点$u$拆成2个表示 1.放在柱子最下面,与S连接(u) 2.满足和下面的数的和为完全平方数,与T连接(u') 满足关系的两个点u.v,建立v-u' 当一个点被加入后,它就相当于放在最下面的点了.…
P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面放球. \((2)\) 在同一根柱子中,任何\(2\)个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在\(n\)根柱子上最多能放多少个球.例如,在 \(4\) 根柱子上最多可放 \(11\) 个球. 编程任务: 对于给定的\(n\),计算在\(n\)根柱子上最多能放多少个球. 输入输出格式…
P2765 魔术球问题 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11 个球. «编程任务: 对于给定的n,计算在n根柱子上最多能放多少个球. 输入格式 第1 行有1个正整数n,表示柱子数. 输出格式 程序运行结束时,将n 根柱子上最多能放的球数以及相…
P2765 魔术球问题 知识点::最小点覆盖 这个题目要拆点,这个不是因为每一个球只能用一次,而是因为我们要求最小点覆盖,所以要拆点来写. 思路: 首先拆点,然后就是开始建边,因为建边的条件是要求他们可以组成一个平方数,这个平方数最大就是x*x,最小就是x  大致就是这样, 所以去遍历然后建边,最后每次就跑残余网络,如果最大流增加了,就说明这个可以和之前的建边,否则就说明不可以,就要给它一个新柱子. 路径输出一般就是两个数组,一个tag,一个to 我的这份代码写的好搓. #include <cs…
题目链接 这题……讲道理我没看懂. 不过我看懂题解的代码是在干嘛了qwq 题解是zhaoyifan的题解 然后……我来讲讲这个题解好了. 题解把值为i的球拆成了两个,一个编号是i*2,一个编号是i*2+1. 为什么编号要这么编呢?因为统计编号的时候好统计qwq 然后从起点向i*2连一条边,从i*2+1到终点连一条边. 然后对于能够跟他凑成完全平方数的连边. 然后跑最大流,如果发现这个球不能串进原来的柱子上,也就是说最大流没有变化,那么就新加一条柱子. 当柱子数超过n的时候就退出循环开始统计. 大…
https://www.luogu.org/problemnew/show/P2765 看到这一题第一眼想到:这不是二分最大流吗,后来发现还有一种更快的方法. 首先如果知道要放多少个球求最少的柱子,很显然是一道最小点路径覆盖的题,将一个点拆成u,v两个点,u和S相连,v和T相连,之后的有向边i,就用ui和vj相连即可. 但是这题首先不知道有多少个球,所以考虑依次加入点以及和这个点相关的边,然后在残余网络上跑新的最大流,如果可以跑出流量来意味着这个点成功在现有的柱子上按排上了,如果跑不出来说明按排…
题目链接:https://www.luogu.org/problemnew/show/P2765 知识点: 最大流 解题思路: 本题所有边的容量均为 \(1\). 从 \(1\) 开始加入数字,将这个数拆成两个点:\(P_1\) 连源点,\(P_2\) 连汇点,然后枚举所有比它小并且与它加起来是完全平方数的正整数 \(Num\) ,从 \(Num\) 的 \(P_1\) 连一条边到目前要加入的数字的 \(P_2\). 建完边后在之前的残量网络的基础上跑 \(Dinic\),如果没有新的流量通过,…
贪心做法 每次尽可能选择已经放过球的柱子 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int num[100][1000],n; bool chk(const int &a,const int &b){ int t=sqrt(a+b); retu…