洛谷 P2765 魔术球问题 解题报告
P2765 魔术球问题
题目描述
问题描述:
假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球。
\((1)\) 每次只能在某根柱子的最上面放球。
\((2)\) 在同一根柱子中,任何\(2\)个相邻球的编号之和为完全平方数。
试设计一个算法,计算出在\(n\)根柱子上最多能放多少个球。例如,在 \(4\) 根柱子上最多可放 \(11\) 个球。
编程任务:
对于给定的\(n\),计算在\(n\)根柱子上最多能放多少个球。
输入输出格式
输入格式:
第\(1\)行有\(1\)个正整数\(n\),表示柱子数。
输出格式:
程序运行结束时,将 \(n\) 根柱子上最多能放的球数以及相应的放置方案输出。
文件的第一行是球数。
接下来的\(n\)行,每行是一根柱子上的球的编号。
说明
感谢 @PhoenixEclipse
提供spj
\(4\le n\le 55\)
首先可以发现柱子越多球不会放的更少,所以可以二分答案球的个数。
把球向大的数值连有向边,发现是对DAG求最小路径覆盖,那么直接二分图匹配求。
求匹配也可以跑网络流,不过就不能二分了,每次加球在残余网络上跑,看看跑不跑的出新流量,跑不出来就加柱子。
二分上界可以最开始二分一下,发现不超过2000
Code:
#include <cstdio>
#include <cstring>
#include <cmath>
const int N=2010;
const int M=2e5+10;
int head[N],to[M],Next[M],cnt;
void add(int u,int v)
{to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int k,match[N],vis[N],bee[N];
bool dfs(int now)
{for(int v,i=head[now];i;i=Next[i]){if(!vis[v=to[i]]){vis[v]=1;if(!match[v]||dfs(match[v]))return bee[match[v]=now]=v,true;}}return false;
}
bool check(int n)
{memset(head,0,sizeof head),cnt=0;memset(match,0,sizeof match);memset(bee,0,sizeof bee);int ans=0;for(int i=1;i<=n;i++)for(int j=sqrt(i<<1)+1;j*j-i<=n;j++)if(j*j-i>i) add(i,j*j-i);for(int i=1;i<=n;i++){memset(vis,0,sizeof vis);if(dfs(i)) ++ans;}return n-ans<=k;
}
void dfs0(int now)
{if(vis[now]) return;vis[now]=1;printf("%d ",now);dfs0(bee[now]);
}
int main()
{scanf("%d",&k);int l=1,r=2000;while(l<r){int mid=l+r+1>>1;if(check(mid)) l=mid;else r=mid-1;}check(l);printf("%d\n",l);memset(vis,0,sizeof vis),vis[0]=1;for(int i=1;i<=l;i++)if(!vis[i])dfs0(i),puts("");return 0;
}
2019.1.16
转载于:https://www.cnblogs.com/butterflydew/p/10276037.html
洛谷 P2765 魔术球问题 解题报告相关推荐
- 洛谷 P2765 魔术球问题 (dinic求最大流,最小边覆盖)
P2765 魔术球问题 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2 ...
- 洛谷 - P2765 魔术球问题(最大流+残余网络上的最大流+路径打印)
题目链接:点击查看 题目大意:给出n个柱子,问若按照规则摆放,最多能放多少个球,规则如下: 每次只能在某根柱子的最上面放球 在同一根柱子中,任何2个相邻球的编号之和为完全平方数 并输出方案 题目分析: ...
- 【洛谷】P4147 玉蟾宫 解题报告
[洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...
- 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...
- 「洛谷P1343」地震逃生 解题报告
P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...
- 洛谷 P4284 [SHOI2014]概率充电器 解题报告
P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- 洛谷 [SDOI2015]约数个数和 解题报告
[SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...
- 洛谷 CF1043F Make It One 解题报告
CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...
- 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告
P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...
最新文章
- codevs地鼠游戏(贪心)
- golang中的goredis
- 【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate
- pdf英文转换成html网页,PDF文件转换成html网页文件小方法
- MySQL Workbench给其他IP用户分配权限
- BIND9源码分析之 多个view的情况下如何做dynamic update
- (摘要)100个伟大的商业理念:理念35:引爆流行
- 怎么用java打开pkg文件怎么打开_pkg文件怎么打开,小编教你怎么打开pkg文件
- 《构建高可用Linux服务器 第3版》—— 1.5 Linux服务器的优化
- android l fox x86,【原创】X61T笔触(无手触)安卓(X86)系统真正完美
- AGV、IGV、RGV这三者之间的区别浅析
- win10到2008服务器smb协议,如何启用或禁用SMB1文件共享协议在Windows
- PP-YOLOE论文解析
- 仿微信发朋友圈获取定位
- 金融数据智能峰会 | 数据规模爆炸性增长,企业如何进行精准决策?云原生数据仓库数据化运营实战分享
- Havel—Hakimi定理(度序列)
- 内含18禁~~关于自学\跳槽\转行做网络安全行业的一些建议
- 微积分入门:无穷小之比与无穷小求和
- 智能车辆路径跟踪滑膜控制+单点预瞄
- 音乐或视频下载:Chrome下载媒体资源
热门文章
- power bi连接mysql_一起学微软Power BI系列-使用技巧(6) 连接Sqlite数据库
- mysql less6教程_Sqli labs系列-less-56 报错注入法(上)
- asp mysql text_11种ASP连接数据库的方法
- 计算机视觉论文-2021-06-11
- 有哪些越早知道越好的人生经验?
- 2019年财政收支分析_2019年模锻行业经济运行情况分析
- 渗透测试入门4之内网跨边界应用
- Oracle中随机抽取N条记录,使用Oracle分析函数随机抽取N条记录
- Java基础---匿名对象的理解和使用
- EasyUI--权限管理(二)显示左侧菜单