栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2020第11届蓝桥杯国赛试题B:扩散( C++ / C )

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2020第11届蓝桥杯国赛试题B:扩散( C++ / C )

 个人简介

大家好,我是3月份新人榜排名第三的 ༺Blog༒Hacker༻
支持我:点赞+收藏⭐️+留言
格言:༺永做优质༒programmer༻

注(具体请见CF665B Shopping):

⚜️我的更新时间会有所改变,每月2-4篇,感谢各位长期以来的支持!

2020第11届蓝桥杯国赛试题B:扩散( C++ / C )

⚜️题目描述
一个点每过一个单位时间就会向 4 4 4 个方向扩散一个距离,如图所示:两个点 a 、 b a、b a、b连通,记作 e ( a , b ) e(a,b) e(a,b),当且仅当 a 、 b a、b a、b 的扩散区域有公共部分。

连通块的定义是块内的任意两个点 u 、 v u、v u、v都必定存在路径 e ( u , a 0 ) , e ( a 0 , a 1 ) , . . . , e ( a k , v ) e(u,a0),e(a0,a1),...,e(ak,v) e(u,a0),e(a0,a1),...,e(ak,v)。

给定平面上的 n n n 个点,问最早什么时候它们形成一个连通块?

⚜️输入格式
第一行一个数 n n n ,以下 n n n 行,每行一个点坐标。

⚜️输出格式
输出仅一个数,表示最早的时刻所有点形成连通块。

⚜️样例输入

2
0 0
5 5

⚜️样例输出

5

⚜️数据范围与提示
对于 20% 的数据,满足 1 ≤ n ≤ 5 , 1 ≤ X i , Y i ≤ 50 1≤n≤5,1≤X_i,Y_i≤50 1≤n≤5,1≤Xi​,Yi​≤50;
对于 100% 的数据,满足 1 ≤ n ≤ 50 , 1 ≤ X i , Y i ≤ 109 1≤n≤50,1≤X_i,Y_i≤109 1≤n≤50,1≤Xi​,Yi​≤109。
时间限制: 1 s 1s 1s
空间限制: 512 M B 512MB 512MB

CODE
#include
#define ll long long
#define MAXN 10005
using namespace std;
int n,m[MAXN][MAXN],a[MAXN];
struct node{
	int x,y;	
}k[MAXN];
void Manhattan() 
{
	for(int i=1;i
		for(int j=i+1;j<=n;++j) 
		{
			m[j][i]=m[i][j]=abs(k[i].x-k[j].x)+abs(k[i].y-k[j].y);
		}
	}
}
int check(ll s) 
{	
	int flor=0,sum=1,flag[MAXN]={ };
	a[1]=1;
	flag[1]=1;
	while(flor
		flor++;
		for(int i=1;i<=n;++i) 
		{
			if(flag[i]) 
			{
				continue;
			}
			if(m[a[flor]][i]<=2*s) 
			{
				flag[i]=1;
				a[++sum]=i;
			}
		}
	}
	return sum==n;
}
int main() 
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i) 
	{
		scanf("%d %d",&k[i].x,&k[i].y);
	}
	Manhattan();
	int l=0,r=1000000005,mid;
	while(l<=r) 
	{
		mid=l+((r-l)/2);
		if(check(mid)) 
		{
			r=mid-1;
		}
		else
		{
			l=mid+1;
		}
	}
	printf("%d",l);
	return 0;
} 
朋友们,点赞是我更新的动力,下期再见,拜拜!!!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1008228.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号