扩散题解

1.【题目描述】:

一个点每过一个单位时间就会向四个方向扩散一个距离,如图。
在这里插入图片描述
两个点a、b连通,记作e(a,b),当且仅当a、b的扩散区域有公共部分。连通块的定义是块内的任意两个点u、v都必定存在路径e(u,a0),e(a0,a1),…,e(ak,v)。给定平面上的n给点,问最早什么时刻它们形成一个连通块。

【输入】

第一行一个数n,以下n行,每行一个点坐标。

【输出】

一个数,表示最早的时刻所有点形成连通块。

【输入样例】

2
0 0
5 5

【输出样例】

5

2.解析:

首先我们要明白此点距离与时间的关系,不难发现此距离即为点到原点的曼哈顿距离(读者自证),所以我们只需枚举时间,让其时间满足其时间>=曼哈顿距离即可。读者需要注意,两点的距离最远不会超过2倍时间,否则将不被满足联通,这很好理解:因为最极端的情况即为两点对立,且点到原点距离为最大时间,此时距离为2*时间。
知道以上几点我们不难想到用二分枚举时间,求出最小时间且满足距离不会超过2倍时间,值得一提的是这里可以用并查集来联通,当然也可以定义一个标记数组来做,如:

int step = 0, sum = 1, flag[1005] = {
    };
	b[1] = 1;
	flag[1] = 1;
	while(step != sum) {
   //当等于是即有一组不满足跳出
		step++;
		for(int i = 1;i <= n; i++) {
   
			if(flag[i]) 
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值