【PowerOJ1739】 魔术球问题

https://www.oj.swust.edu.cn/problem/show/1739 (题目链接)

题意

  n个柱子上放小球,每根柱子上相邻两个小球的数字之和必须是完全平方数,只有放了x号小球才可以放x+1号小球。问最多可以放多少小球,以及方案。

Solution

  最小路径覆盖。

  每个小球当做一个节点,向比它大的并且能组成完全平方数的小球连有向边,有几条路径覆盖即为所需要的柱子数。于是二分答案+二分图匹配。

  然而······本地AC到OJ上却RE了是什么鬼。。。跪求大佬查错Orz。

代码

// PowerOJ1739
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

const int maxn=100010;
struct edge {int to,next;}e[maxn*10];
int head[maxn],p[maxn],vis[maxn],d[maxn];
int cnt,n;

void link(int u,int v) {
	e[++cnt]=(edge){v,head[u]};head[u]=cnt;
}
bool match(int x,int mx) {
	vis[x]=cnt;
	for (int i=head[x];i;i=e[i].next) if (e[i].to<=mx && vis[e[i].to]!=cnt) {
			vis[e[i].to]=cnt;
			if (!p[e[i].to] || match(p[e[i].to],mx)) {p[e[i].to]=x;return 1;}
		}
	return 0;
}
void dfs(int x) {
	vis[x]=cnt;
	for (int i=head[x];i;i=e[i].next) if (d[e[i].to]==x) dfs(e[i].to);
}
bool check(int mid) {
	int res=0;
	for (int i=1;i<=mid;i++) p[i]=0;
	for (int i=1;i<=mid;i++) {
		cnt++;
		if (match(i,mid)) res++;
	}
	return mid-res<=n;
}
void print(int ans) {
	printf("%d\n",ans);
	memset(vis,0,sizeof(vis));cnt=0;
	for (int i=1;i<=ans;i++) if (!d[i] && !vis[i]) {
			cnt++;
			dfs(i);
		}
	for (int i=1;i<=cnt;i++) {
		for (int j=1;j<=ans;j++) if (vis[j]==i) printf("%d ",j);
		puts("");
	}
}
int main() {
	scanf("%d",&n);
	for (int i=1;i<=2000;i++)
		for (int j=i+1;j<=2000;j++)
			if (sqrt(i+j)*sqrt(i+j)==i+j) link(i,j);
	int l=1,r=2000,ans;cnt=0;
	while (l<=r) {
		int mid=(l+r)>>1;
		if (check(mid)) {
			for (int i=1;i<=mid;i++) d[i]=p[i];
			ans=mid,l=mid+1;
		}
		else r=mid-1;
	}
	print(ans);
    return 0;
}

 

时间: 2024-11-05 22:47:52

【PowerOJ1739】 魔术球问题的相关文章

POWOJ 1739: 魔术球问题 DAG最小路径覆盖转最大流

1739: 魔术球问题 题意: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.对于给定的n,计算在n根柱子上最多能放多少个球. tags: 对大佬来说应该是很素的一道题,但某还是花了好多时间才做出来.. 一开始连建图都有点懵,然后最小路径还是新概念,最大匹配也不太懂,最大流倒是会一点. 然后要打印答案,也不

【网络流24题】魔术球问题

P1226 - [网络流24题]魔术球问题 Description 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可 放11个球. ′编程任务: 对于给定的n,计算在 n根柱子上最多能放多少个球. Input 第1 行有 1个正整数n,表示柱子数. Output 第一行是球

cogs_396_魔术球问题_(最小路径覆盖+二分图匹配,网络流24题#4)

描述 http://cojs.tk/cogs/problem/problem.php?pid=396 连续从1开始编号的球,按照顺寻一个个放在n个柱子上,\(i\)放在\(j\)上面的必要条件是\(i+j\)是一个完全平方数.问做多能放到几号球. 分析 cogs是简化版,我在网上找了个完整版的测试数据,要求输出方案... 求最大放几号球不方便,我们考虑枚举最大的球号,计算最少需要多少柱子. 我们对于满足\(j<i\)且\(i+j\)是一个完全平方数的\(i,j\),从\(j\)向\(i\)连一条

【水】弱化版魔术球问题

卖个萌 这是一个弱化版的魔术球问题,本来都不好意思丢上来...但是这几天都在看代码没有写东西,还是丢一下凑凑数吧. 不要问我正解哪里进,我也没找到,反正百度魔术球问题第一页都是错的.所有代码都跑不出结果.600这么low的数据没有一个所谓AC代码可以跑的过(似乎我代码加了输出方案也过不去..).所以后面我的数据600就是用没有加输出方案的我的弱弱的程序跑的... 我的代码加了输出方案丢在最后附数据的文章里面了..错的,不过我会尽快改对的..... 魔术球问题弱化版(ball.c/.cpp/.pa

魔术球问题 2011-12-29

算法实现题8-4 魔术球问题(习题 8-14) ´问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,¼的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11个球. ´编程任务: 对于给定的n,计算在 n根柱子上最多能放多少个球. ´数据输入: 由文件input.txt提供输入数据.文件第1 行有 1个正整数n,表示柱子数.

【多题合集】网络流24题练习(更新至魔术球问题)

飞行员配对问题(仅求方案总数) 传送门 思路:二分图后dinic走起,各边容量为1 代码: #include<bits/stdc++.h> #define inf 0x7ff using namespace std; int ans,n,n1,s,t,tot=1; int first[105],dis[105],up[105]; bool vis[105]; queue<int>q; struct edge { int u,v,next,w; }e[500]; void add(i

LiberOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖

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 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在 

【网络流24题】魔术球

LOJ 6003 [网络流24题]魔术球 题面 [题目描述] 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在 n 根柱子上最多能放多少个球. [输入格式] 文件第 1 行有 1 个正整数 n(n <= 50) ,表示柱子数. [输出格式] 第一行是球数.接下来的 n 行,每行是一根柱子上的球的编号. 题解 能放的球数非常少,所以我们

【网络流24题】魔术球问题(最小不相交路径覆盖)

[网络流24题]魔术球问题 2014年3月7日3,5344 Description 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,4的球.(1)每次只能在某根柱子的最上面放球.(2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数.试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11 个球. 编程任务:对于给定的n,计算在n根柱子上最多能放多少个球. Input Format 文件第1 行有1个正整数n,表示柱子数. Output Fo

[loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

#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 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在