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

洛谷 P2765 魔术球问题 解题报告的更多相关文章

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

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

  2. 洛谷P2765魔术球问题 最小路径覆盖

    https://www.luogu.org/problemnew/show/P2765 看到这一题第一眼想到:这不是二分最大流吗,后来发现还有一种更快的方法. 首先如果知道要放多少个球求最少的柱子,很 ...

  3. 洛谷P2765 魔术球问题

    题目链接:https://www.luogu.org/problemnew/show/P2765 知识点: 最大流 解题思路: 本题所有边的容量均为 \(1\). 从 \(1\) 开始加入数字,将这个 ...

  4. 洛谷 [P2765] 魔术球问题

    贪心做法 每次尽可能选择已经放过球的柱子 #include <iostream> #include <cstdio> #include <cstring> #inc ...

  5. 洛谷P2765 魔术球问题(最大流)

    传送门 %%%KSkun大佬 话说明明是网络流……这题竟然还有打表找规律和纯贪心AC的……都是神犇啊…… 来说一下如何建图.首先把每一个点拆成$X_i$和$Y_i$,然后$S$向$X_i$连一条容量为 ...

  6. 洛谷P2765 魔术球问题(贪心 最大流)

    题意 已经很简洁了吧. 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全 ...

  7. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  8. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  9. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

随机推荐

  1. 基于多进程和基于多线程服务器的优缺点及nginx服务器的启动过程

    基于多进程服务器的优点: 1.由操作系统进行调度,运行比较稳定强壮 2.能够方便地通过操作系统进行监控和管理 例如对每个进程的内存变化状况,甚至某个进程处理什么web请求进行监控.同时可以通过给进程发 ...

  2. Exp2 MAL_后门原理与实践 20155214

    目录 Exp2 MAL_后门原理与实践 实验内容 通过nc反向连接创建后门 meterpreter应用 主要思路 知识点 启发 Exp2 MAL_后门原理与实践 本次实验操使用nc实现win,mac, ...

  3. SVD(奇异值分解)Python实现

    注:在<SVD(奇异值分解)小结 >中分享了SVD原理,但其中只是利用了numpy.linalg.svd函数应用了它,并没有提到如何自己编写代码实现它,在这里,我再分享一下如何自已写一个S ...

  4. Ubuntu中程序部署时无法加载动态库的解决方法

    Ubuntu下修改环境变量的三种方法 添加环境变量无法解决,可尝试如下操作: sudo vim /etc/ld.so.conf 在ld.so.conf中加入动态库的目录... 然后 sudo ldco ...

  5. opengl学习记录1——矩形绘制

    #include <windows.h> #include <gl/GL.h> #include <gl/GLU.h> #include <glut.h> ...

  6. JavaScript快速入门-实战(例子)

    1.模拟bootstrap中的模态框 效果图:(点我后,弹出对话框,最下面的内容可以看到,但是有一定的透明度.) 思路分析: 整体分为三层,最底层(点我),中间透明层(实现透明效果),最顶层(最新内容 ...

  7. [DEBUG]椭圆的中点Bresenham算法边缘绘制出现错误

    在使用椭圆的中点Bresenham算法绘制椭圆时, 当椭圆足够大时, 椭圆的边缘会出现下面这种情况. 出错原因: 将a, b声明为了int类型, 导致中点判别式中发生溢出 关注后面的a*b*a*b当a ...

  8. muduo网络库学习笔记(三)TimerQueue定时器队列

    目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...

  9. Nextcloud13私有云盘安装指南

    一.环境说明: ※操作系统版本CentOS 7.5 Minimal-1804 ※操作系统版本已经使用163 YUM源 ※ Nextcloud版本 13.05 ※ 数据库使用MariaDB,安装在同一台 ...

  10. bugkuct部分writeup 持续更新

    6307 校赛被打击到自闭,决心好好学习. web部分题目. 1.web2 地址 http://123.206.87.240:8002/web2/ 既然是第一个题我们应该采取查看源码的方式进行,右键之 ...