题目链接:https://www.luogu.org/problemnew/show/P1783

先把题目改造一下:题目所求是要一条能从0列到n列的路径,使其路径上的最大边长一半最小。

为什么是一半呢?

考虑半径这个东西,假如两个点之间距离为d,半径分别为r1,r2。需满足r1 + r2 >= d

若当前d为所求路径上的最大边长,那么当且仅当r1 = r2 = d/2时有最小的r满足条件,否则若一个r < d/2,另一个就会是r > d/2,取最大的r还是>d/2。

那么剩下的问题是怎么求出符合条件(覆盖0—n列)的路径。

如果我们把每个线段(两端点+线长)看作一个集合,只要有x坐标为0的线段和x坐标为n的线段在一个集合就可以证明0—n被覆盖了。

因为在0列和n列上不一定有哨塔,所以我们考虑点到0列和n列的线段也是一个集合。

注意的就是在把每一个点到0和n分别作出垂线段来,而不是最近的点分别到0和n的垂线段。(我在这卡了30分)

处理集合问题用——并查集。

那么剩下的只有求出最短的r来,想到贪心的策略。

——类似kruskal的算法实现。

code:

#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1010;
struct edge{
int u, v;
double w;
}e[1000010];
bool cmp(edge x, edge y)
{
return x.w < y.w;
}
int n, m, cnt, fa[maxn];
int dx[maxn], dy[maxn];
double distance(int x1, int y1, int x2, int y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void init()
{
for(int i = 0; i <= m+1; i++) fa[i] = i; for(int i = 1; i < m; i++)
for(int j = i+1; j <= m; j++)
e[++cnt].u = i, e[cnt].v = j, e[cnt].w = distance(dx[i], dy[i], dx[j], dy[j])/2;
for(int i = 1; i <= m; i++)
e[++cnt].u = i, e[cnt].v = 0, e[cnt].w = dx[i];
for(int i = 1; i <= m; i++)
e[++cnt].u = i, e[cnt].v = m+1, e[cnt].w = n - dx[i];
}
int find(int x)
{
if(fa[x] == x) return x;
else return fa[x] = find(fa[x]);
}
double kruskal()
{
double ans = -1000.0;
sort(e+1, e+cnt+1, cmp);
for(int i = 1; i <= cnt; i++)
{
int fu = find(e[i].u); int fv = find(e[i].v);
if(fu != fv)
{
fa[fu] = fv;
ans = max(ans, e[i].w);
}
int f0 = find(0); int fm = find(m+1);
if(f0 == fm) break;
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
int L = n+2, R = -1;
for(int i = 1; i <= m; i++)
scanf("%d%d",&dx[i],&dy[i]);
init();
printf("%0.2f",kruskal());
return 0;
}

【luogu P1783 海滩防御】 题解的更多相关文章

  1. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  2. 洛谷 P1783 海滩防御 解题报告

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  3. P1783 海滩防御

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  4. 洛谷:P1783 海滩防御(二分+并查集 最短路 最小生成树)

    题意: 给定长度为N的海滩,然后有M做防御塔,给出每座塔的位置Xi,到海岸的距离Yi. 求防御塔上最小观测半径Ri,使得海滩被封锁. 思路:要使左边界和右边界连通. 很nice,可以二分+并查集做. ...

  5. 洛谷 P1783 海滩防御

    题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭.于是,WLP动用了他 ...

  6. 洛谷P1783海滩防御

    题目 跟奶酪那道题差不多,用并查集来求解. 用二分,或可以用类似于克鲁斯卡尔算法的贪心来每次判断是否起点和终点已经并在一个集合里(类似奶酪) 如果已经覆盖就结束判断并得出答案:即当前选择的边的最大值. ...

  7. 【luogu P5022 旅行】 题解

    题目连接:https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分,很容易想到当 m = n - 1 时的树的 ...

  8. [luoguP1783] 海滩防御(二分 || 最短路 || 最小生成树)

    传送门 因为答案满足单调性,所以看到这个题,第一反应是二分,但是总是WA,也没有超时. 看了题解,,,,,, 这题刚开始很多人会想到二分,二分答案,然后看看是否能绕过所有信号塔,但是,这样写明显超时, ...

  9. 【luogu P2831 愤怒的小鸟】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2831 写点做题总结:dp,搜索,重在设计状态,状态设的好,转移起来也方便. 对于一条抛物线,三点确定.(0, ...

随机推荐

  1. 分层图最短路【bzoj2763】: [JLOI2011]飞行路线

    bzoj2763: [JLOI2011]飞行路线 Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0 ...

  2. Exadata Smart Flash Logging工作原理

    Exadata在V2时代,ORACLE为了进一步拓宽客户人群,除了宣称Exadata适用OLAP系统,同时也适用于OLTP系统,那怎么才能满足OLTP系统的高IOPS要求呢?于是Exadata引入了闪 ...

  3. Boost多线程

    一.概述     线程是在同一程序同一时间内允许执行不同函数的离散处理队列,这使得在一个长时间进行某种特殊运算的函数在执行时不阻碍其他的函数时变得十分重要.线程实际上允许同时执行两种函数,而这两者不必 ...

  4. gulp的watch记事本

    let gulp=require('gulp'), nodemon=require('gulp-nodemon'), browser=require('browser-sync'); let relo ...

  5. 原生JS实现雪花特效

    今天在校园招聘上被问到的问题,用JS写出雪花的效果.我打算使用多种方法来试试如何实现雪花. 这是目前按照网上某种思路模仿的第一种雪花,不太好看,但是大致意思清楚. 思路1:该思路直接由JS实现. 雪花 ...

  6. abp架构中加载公共css样式表和公共js的文件目录位置

    src\shared\helpers\LocalizedResourcesHelper.ts

  7. 阿里巴巴Java开发手册_不建议在循环体中使用+进行字符串拼接

    18. [推荐]循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展. 说明:下例中,反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然 ...

  8. POJ 1556 E - The Doors

    题意:给定n堵墙,现在要你从(0,5)走去(10,5)的最短距离 思路:刚开始还想模拟,就是从(0,5)走,每次x向右一格,然后判断有没和线段相交就可以.但是它的们有可能是小数形式给出的,这样就GG了 ...

  9. OpenStack Cirros

    Cirros Openstack的开发,基本都使用这个image来测试,因为他比较小,只有10M. 镜像介绍 镜像的地址: https://launchpad.net/cirros/trunk/0.3 ...

  10. NLog学习笔记一

    一.NLog是什么? NLog是一个基于.NET的免费的开源的日志记录类库.(官网:http://nlog-project.org/) NLog特点如下: 配置简单方便.可以将配置信息写的应用程序的配 ...