LuoguP2765 魔术球问题(最大流)】的更多相关文章

题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11 个球. «编程任务: 对于给定的n,计算在n根柱子上最多能放多少个球. 输入输出格式 输入格式: 第1 行有1个正整数n,表示柱子数. 输出格式: 程序运行结束时,将n 根柱子上最多能放的球数以及相应的放…
LuoguP2765 魔术球问题 首先,很难看出来这是一道网络流题.但是因为在网络流24题中,所以还是用网络流的思路 首先考虑完全平方数的限制. 如果\(i,j\)满足\(i < j\) 且 $i + j \(为完全平方数我们就在\)i - j $连一条有向边 练完之后我们会得到这样一个图(图来自luogu题解) 发现这是一个DAG,而且我们将柱子的限制转化为路径条数.问题就转化成了 LuoguP2764 最小路径覆盖问题 然后,我们就一直加球,加到需要的路径条数大于给定的柱子数为止 #incl…
传送门 枚举球的个数 num 如果 i < j && (i + j) 是完全平方数,那么 i -> j' 连一条边 再加一个超级源点 s,s -> i 再加一个超级汇点 t,i' -> t 那么当前可以放的柱子的最小数量就是最小不相交路径数 如果当前的最小不相交路径数 > num,break 求最大流的时候别忘了记录方案 ——代码 #include <cmath> #include <queue> #include <cstdio…
传送门 网络流好题. 这道题可以动态建图. 不难想到把每个球iii都拆点成i1i_1i1​和i2i_2i2​,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1​),(i2​,t),如果(u,v)(u,v)(u,v)可以匹配的话就连边(u1,v2)(u_1,v_2)(u1​,v2​),然后用最大流检验,如果能流动说明不用加柱子,否则需要新加一个柱子. 题目还要求输出方案. 那么我们在dfsdfsdfs的时候更新后继就可以了. 代码: #include<bits/stdc+…
Libre 6003 「网络流 24 题」魔术球 (网络流,最大流) Description 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可 放11个球. ´编程任务: 对于给定的n,计算在 n根柱子上最多能放多少个球. Input 第1 行有 1个正整数n,表示柱子数.…
P2765 魔术球问题 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11 个球. «编程任务: 对于给定的n,计算在n根柱子上最多能放多少个球. 输入格式 第1 行有1个正整数n,表示柱子数. 输出格式 程序运行结束时,将n 根柱子上最多能放的球数以及相…
描述 http://cojs.tk/cogs/problem/problem.php?pid=396 连续从1开始编号的球,按照顺寻一个个放在n个柱子上,\(i\)放在\(j\)上面的必要条件是\(i+j\)是一个完全平方数.问做多能放到几号球. 分析 cogs是简化版,我在网上找了个完整版的测试数据,要求输出方案... 求最大放几号球不方便,我们考虑枚举最大的球号,计算最少需要多少柱子. 我们对于满足\(j<i\)且\(i+j\)是一个完全平方数的\(i,j\),从\(j\)向\(i\)连一条…
P2765 魔术球问题 知识点::最小点覆盖 这个题目要拆点,这个不是因为每一个球只能用一次,而是因为我们要求最小点覆盖,所以要拆点来写. 思路: 首先拆点,然后就是开始建边,因为建边的条件是要求他们可以组成一个平方数,这个平方数最大就是x*x,最小就是x  大致就是这样, 所以去遍历然后建边,最后每次就跑残余网络,如果最大流增加了,就说明这个可以和之前的建边,否则就说明不可以,就要给它一个新柱子. 路径输出一般就是两个数组,一个tag,一个to 我的这份代码写的好搓. #include <cs…
原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在根柱子上最多能放多少个球. Solution 如果是完全平方数则连有向边,那么一个柱子上的球就相当于图中的一条路径.二分答案,以是否能用不超过条路径覆盖作为条件. Code //「网络流 24 题」魔术球 #include <cstdio> #include <cstring>…
P2765 魔术球问题 贪心模拟就可以过.........好像和dinic没啥关系   找找规律发现可以贪心放.n又灰常小. 设答案=m 你可以$O(mn)$直接模拟过去 闲的慌得话可以像我用个$set$维护 复杂度可以降为$O(mlogn)$ 网络流.....不会写(逃   口胡一下dinic 一个点$u$拆成2个表示 1.放在柱子最下面,与S连接(u) 2.满足和下面的数的和为完全平方数,与T连接(u') 满足关系的两个点u.v,建立v-u' 当一个点被加入后,它就相当于放在最下面的点了.…
6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,⋯ 1, 2, 3, 4, \cdots1,2,3,4,⋯ 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出…
P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面放球. \((2)\) 在同一根柱子中,任何\(2\)个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在\(n\)根柱子上最多能放多少个球.例如,在 \(4\) 根柱子上最多可放 \(11\) 个球. 编程任务: 对于给定的\(n\),计算在\(n\)根柱子上最多能放多少个球. 输入输出格式…
#6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,⋯ 1, 2, 3, 4, \cdots1,2,3,4,⋯ 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算…
传送门 %%%KSkun大佬 话说明明是网络流……这题竟然还有打表找规律和纯贪心AC的……都是神犇啊…… 来说一下如何建图.首先把每一个点拆成$X_i$和$Y_i$,然后$S$向$X_i$连一条容量为$1$的边,$Y_i$向$T$连一条容量为$1$的边.对于能和它组成完全平方数的点,从$A_j$向$B_i$连一条容量为$1$的边 然后考虑一下,加球不会导致柱子减少,所以可以枚举球数,然后每次加一个球,并跑一次最大流.如果新加入的球是能加到某一个柱子中的,那么这一次跑最大流是能得到新流的,只要能一…
题意 已经很简洁了吧. 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球 Sol 这题有两种做法 1:贪心,能放就放 2:网络流 首先考虑到每个元素只能用因此,拆为$a_i$,$b_i$ 从$S$向$a_i$连权值为$1$的边,从$b_i$向$T$连权值为$1$的边 依次枚举加入的每一个数,每次跑最大流,若更优…
题意: 思路: 0.[问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [建模方法] 枚举答案A,在图中建立节点1..A.如果对于i<j有i+j为一个完全平方数,连接一条有向边(i,j).该图是有向无环图,求最小路径覆盖.如果刚好满足最小路径覆盖数等于N,那么A是一个可行解,在所有可行 解中找到最大的A,即为最优解. 具体方法可以顺序枚举A的值,当最小路径覆盖数刚好大于N时终止,A-1就是最优解. [建模分析] 由于是顺序放球,每根柱子上的球满…
本题枚举每多一个球需要多少个柱子,可以边加边边计算,每次只需要判断$i-Dinic()$即可:特别注意边界. #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <queue> usin…
传送门 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11 个球. «编程任务: 对于给定的n,计算在n根柱子上最多能放多少个球. 输入输出格式 输入格式: 第1 行有1个正整数n,表示柱子数. 输出格式: 程序运行结束时,将n 根柱子上最多能放的球数以及…
题解:每次加入两个点,对于和为平方数的两个值所对应的点建边,反正网络流可以跑残量网络,所以就没有什么关系了…… 代码如下: #include<cmath> #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define inf 0x3f3f3f3f using namespace std; ],next[…
问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11个球. ´编程任务: 对于给定的n,计算在 n根柱子上最多能放多少个球. ´数据输入: 文件第1 行有 1个正整数n,表示柱子数. ´结果输出: 文件的第一行是球数. 数据规模 n<=60  保证答案小于16…
题目描述:这里 这道题是网络流问题中第一个难点,也是一个很重要的问题 如果直接建图感觉无从下手,因为如果不知道放几个球我就无法得知该如何建图(这是很显然的,比如我知道 $1+48=49=7^2$ ,可是我都不知道是否能放到第48个球,那我怎么知道如何建边呢?) 所以这时就体现出了一个很重要的想法:枚举答案!!! 我们知道,正常有二分答案的做法,可以二分一个答案然后检验 这里用类似的想法,但由于答案比较小而且建图更方便,所以我们直接从小往大枚举答案即可 之所以建图更方便,是因为如果我们从小向大枚举…
https://www.luogu.org/problemnew/show/P2765 看到这一题第一眼想到:这不是二分最大流吗,后来发现还有一种更快的方法. 首先如果知道要放多少个球求最少的柱子,很显然是一道最小点路径覆盖的题,将一个点拆成u,v两个点,u和S相连,v和T相连,之后的有向边i,就用ui和vj相连即可. 但是这题首先不知道有多少个球,所以考虑依次加入点以及和这个点相关的边,然后在残余网络上跑新的最大流,如果可以跑出流量来意味着这个点成功在现有的柱子上按排上了,如果跑不出来说明按排…
题目描述 假设有 \(n\) 根柱子,现要按下述规则在这 \(n\) 根柱子中依次放入编号为 \(1, 2, 3, 4, \cdots\) 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 \(2\) 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在 \(n\) 根柱子上最多能放多少个球. 输入格式 文件第 \(1\) 行有 \(1\) 个正整数 \(n\),表示柱子数. 输出格式 第一行是球数.接下来的 \(n\) 行,每行是一根柱子上的球的编号. 样例 样例输入 4…
题目链接 这题……讲道理我没看懂. 不过我看懂题解的代码是在干嘛了qwq 题解是zhaoyifan的题解 然后……我来讲讲这个题解好了. 题解把值为i的球拆成了两个,一个编号是i*2,一个编号是i*2+1. 为什么编号要这么编呢?因为统计编号的时候好统计qwq 然后从起点向i*2连一条边,从i*2+1到终点连一条边. 然后对于能够跟他凑成完全平方数的连边. 然后跑最大流,如果发现这个球不能串进原来的柱子上,也就是说最大流没有变化,那么就新加一条柱子. 当柱子数超过n的时候就退出循环开始统计. 大…
题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11 个球. «编程任务: 对于给定的n,计算在n根柱子上最多能放多少个球. 输入输出格式 输入格式: 第1 行有1个正整数n,表示柱子数. 输出格式: 程序运行结束时,将n 根柱子上最多能放的球数以及相应的放…
题目: 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2 ,3,… 的球.(1)每次只能在某根柱子的最上面放球.(2)在同一根柱子中,任何 2 个相邻球的编号之和为完全平方数.试设计一个算法,计算出在 n 根柱子上最多能放多少个球.例如,在 4 根柱子上最多放 11 个球.对于给定的 n,计算在 n 根柱子上最多能放多少个球. 输入格式 输入文件第 1 行有 1 个正整数 n(1<n<60),表示柱子数. 输出格式 输出 n 根柱子上最多能放的球数. 样例数…
题目大意: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球.(1)每次只能在某根柱子的最上面放球.(2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数.试设计一个算法,计算出在n根柱子上最多能放多少个球. 关键字:网络流 拆点 上下界 二分查找 网络流: 想象拿柱子去串球,一个柱子就相当于一个流量为1的流. 拆点建图: 为保证每个球都能串在一个柱子上,将每个球拆成一条边,要求边内流量必须为1(即该边上下界都为1). 若两球数字和为完全平方数,则将一球边的t…
Luogu P2765 一开始看到这道题完全想不到怎么做,绞尽脑汁也想不到怎么去构造这个网络流模型. 于是查看了多篇题解--学习了多篇题解的讲解,终于找到了思路. 本文参考了洛谷 这一道题的题意并不难理解,难就难在如何去构造模型. 显然有一个贪心策略,就是尽可能地放在已经放置过球的柱子上,尽可能少地使用尚未放置球的柱子. 把每一个球视为图上的一个节点,考虑把节点\(p\)拆成两个节点,使用\(p_1\)和\(p_2\)表示,分别令超级源点\(S\)与\(p_1\).\(p_2\)与超级汇点\(T…
题目中没有说球的上限是多少,只告诉了柱子,那么我们就应该以柱子为界去增加球,考虑将每两个能组成完全平方数的点连边,就形成了一个DAG(有向无环图),由于是DAG,可以转换为最小覆盖问题,即最多有n条路径(柱子数),求其能覆盖的最大点数,最小覆盖路径 = 节点数 - 最大匹配数,可以将其拆成二分图跑匈牙利/最大流,由Hall定理,|S| <= |T|,此处的|S|就等于节点数-最大匹配数,而|T|等于最小覆盖路径,就是柱子数n(n个路径必有n个节点),在满足条件的情况下增加球的数量即可. 在求最小…
题意:n根柱子 把编号1,2,3....的球依次插到柱子上去 需要满足相邻的两个球编号加起来为完全平方数 n < 55 题解:网络流24(23)题里的 但是一直不知道怎么建图  或者说建图的意义 一般都要套路拆点 我的理解就是实际问题背景每个点是需要双向边的 但是网络流算法要建反向边 所以就拆点防止重边 意义更明确 这个题的话把小球拆点就表示 一个放前面 一个放后面的情况 然后按题意建图 跑最大流 我最开始以为一条增广路代表一根柱子 其实不是 这里柱子的意义更抽象 模拟一下程序后发现 在依次加球…