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 魔术球问题 解题报告相关推荐

  1. 洛谷 P2765 魔术球问题 (dinic求最大流,最小边覆盖)

    P2765 魔术球问题 题目描述 «问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2 ...

  2. 洛谷 - P2765 魔术球问题(最大流+残余网络上的最大流+路径打印)

    题目链接:点击查看 题目大意:给出n个柱子,问若按照规则摆放,最多能放多少个球,规则如下: 每次只能在某根柱子的最上面放球 在同一根柱子中,任何2个相邻球的编号之和为完全平方数 并输出方案 题目分析: ...

  3. 【洛谷】P4147 玉蟾宫 解题报告

    [洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...

  4. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告

    P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...

  5. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  6. 洛谷 P4284 [SHOI2014]概率充电器 解题报告

    P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  7. 洛谷 [SDOI2015]约数个数和 解题报告

    [SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...

  8. 洛谷 CF1043F Make It One 解题报告

    CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...

  9. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

最新文章

  1. codevs地鼠游戏(贪心)
  2. golang中的goredis
  3. 【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate
  4. pdf英文转换成html网页,PDF文件转换成html网页文件小方法
  5. MySQL Workbench给其他IP用户分配权限
  6. BIND9源码分析之 多个view的情况下如何做dynamic update
  7. (摘要)100个伟大的商业理念:理念35:引爆流行
  8. 怎么用java打开pkg文件怎么打开_pkg文件怎么打开,小编教你怎么打开pkg文件
  9. 《构建高可用Linux服务器 第3版》—— 1.5 Linux服务器的优化
  10. android l fox x86,【原创】X61T笔触(无手触)安卓(X86)系统真正完美
  11. AGV、IGV、RGV这三者之间的区别浅析
  12. win10到2008服务器smb协议,如何启用或禁用SMB1文件共享协议在Windows
  13. PP-YOLOE论文解析
  14. 仿微信发朋友圈获取定位
  15. 金融数据智能峰会 | 数据规模爆炸性增长,企业如何进行精准决策?云原生数据仓库数据化运营实战分享
  16. Havel—Hakimi定理(度序列)
  17. 内含18禁~~关于自学\跳槽\转行做网络安全行业的一些建议
  18. 微积分入门:无穷小之比与无穷小求和
  19. 智能车辆路径跟踪滑膜控制+单点预瞄
  20. 音乐或视频下载:Chrome下载媒体资源

热门文章

  1. power bi连接mysql_一起学微软Power BI系列-使用技巧(6) 连接Sqlite数据库
  2. mysql less6教程_Sqli labs系列-less-56 报错注入法(上)
  3. asp mysql text_11种ASP连接数据库的方法
  4. 计算机视觉论文-2021-06-11
  5. 有哪些越早知道越好的人生经验?
  6. 2019年财政收支分析_2019年模锻行业经济运行情况分析
  7. 渗透测试入门4之内网跨边界应用
  8. Oracle中随机抽取N条记录,使用Oracle分析函数随机抽取N条记录
  9. Java基础---匿名对象的理解和使用
  10. EasyUI--权限管理(二)显示左侧菜单