题目描述

  小$w$伤心的走上了$Star\ way\ to\ heaven$。
  到天堂的道路是一个笛卡尔坐标系上一个$n\times m$的长方形通道(顶点在$(0,0)$和$(n,m)$),小$w$从最左边任意一点进入,从右边任意一点走到天堂。
  最左最右的距离为$n$,上下边界距离为$m$。
  其中长方形内有$k$个$Star$,每个$Star$都有一个整点坐标,$Star$的大小可以忽略不计。
  每个$Star$以及长方形上下两个边缘(宇宙的边界)都有引力,所以为了成功到达$heaven$小$w$离他们越远越好。
  请问小$w$走到终点的路径上,距离所有星星以及宇宙的边界的最小距离最大值可以为多少?


输入格式

一行三个整数$n,m,k$。
接下来$k$行,每行两个整数$x_i,y_i$表示一个点的坐标。


输出格式

一行一个整数表示答案,绝对误差不能超过${10}^{-6}$。


样例

样例输入:

10 5 2
1 1
2 3

样例输出:

1.11803399


数据范围与提示

对于$20\%$的数据,$k\leqslant 10$。
对于$50\%$的数据,$k\leqslant 400$。
对于$80\%$的数据,$k\leqslant 1,000$。
对于$100\%$的数据,$k\leqslant 6,000,n,m\leqslant {10}^6$。


题解

先来重申一下题意(考试的时候没弄明白,当场爆炸),路径不一定直的,中途可以拐弯(我也不知道为什么我考试的时候会下意识以为路径一定是直的)。

明确完了,开始讲题。

首先,我们如果要从两个$Star$之间穿过,那么选择从它们的中点穿过一定不劣,所以我们的问题就转化为了找从左边到右边所有路径中所要穿过的$Star$中离的最近的两个的最大值(语文不好,见谅),这个东西类似于[NOIP模拟测试]:$water$(BFS)这道题,但是当时我是使用$BFS$直接$A$掉的,其实正解就是最小生成树,那么这道题我们也用最小生成树。

怎么利用最小生成树呢?

首先是建图,先将所有的$Star$相互连边,然后再将最靠上的一个点连向上边界,最靠下的一个点连向下边界。

然后我们考虑怎么利用最小生成树,我们要从左边到右边,也就要穿过在最小生成树中从上边界到下边界最短路径中的一条边,而最优策略一定是走最长的那一条边,所以整道题便转化为了找最小生成树中从上边界到下边界的最短路径中的最长边,答案极为这条边边长的一半。

但是我们这里需要注意的是空间问题,显然$Kruskal$算法在稠密图中的空间复杂度高的可怕,而这道题考的我们便是对$Prim$算法的利用,所以有的不常用的算法至少还是要知道其原理的。

下面代码比较清奇,我在$prim$算法上稍作了改动,代码复杂度大幅度减小。

时间复杂度:$\Theta(n^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
double x[7000],y[7000];
double dis[7000];
bool vis[7000];
double ans;
int main()
{
dis[0]=20020923;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
{
scanf("%lf%lf",&x[i],&y[i]);
dis[i]=m-y[i];
}
dis[k+1]=m;
while(1)
{
int flag=0;
for(int i=1;i<=k+1;i++)
if(!vis[i]&&dis[i]<dis[flag])flag=i;
vis[flag]=1;
ans=max(ans,dis[flag]);
if(flag==k+1)break;
for(int i=1;i<=k;i++)
dis[i]=min(dis[i],sqrt((x[i]-x[flag])*(x[i]-x[flag])+(y[i]-y[flag])*(y[i]-y[flag])));
dis[k+1]=min(dis[k+1],y[flag]);
}
printf("%.8lf",ans/2);
return 0;
}

rp++

[CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)的更多相关文章

  1. 7.15考试总结(NOIP模拟16)[Star Way To Heaven·God Knows·Lost My Music]

    败者死于绝望,胜者死于渴望. 前言 一看这个题就来者不善,对于第一题第一眼以为是一个大模拟,没想到是最小生成树. 对于第二题,先是看到了状压可以搞到的 20pts 然后对着暴力一顿猛调后来发现是题面理 ...

  2. NOIP模拟测试24「star way to hevaen·lost my music」

    star way to heaven 题解 大致尝试了一下并查集,记忆化搜索,最小生成树 最小生成树是正解,跑最小生成树然后找到最大的值 欧几里德距离最小生成树学习 prim楞跑 至于为什么跑最小生成 ...

  3. NOIP模拟16:「Star Way To Heaven·God Knows·Loost My Music」

    T1:Star Way To Heaven 基本思路:   最小生成树.   假如我们将上边界与下边界看作一个点,然后从上边界经过星星向下边界连边,会发现,他会形成一条线将整个矩形分为左右两个部分. ...

  4. 0817NOIP模拟测试赛后总结

    吐槽一句:话说NOIP都取消了还叫NOIP模拟真的好么 于是乎我再次爆炸……(0+20+50=70 rank26) 赛时状态 赛时的状态依旧不佳.不过还是硬逼着自己把三道题都读完,然后开始对出题人静坐 ...

  5. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  6. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  7. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  8. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  9. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

随机推荐

  1. python自定义异常实例详解

    python自定义异常实例详解 本文通过两种方法对Python 自定义异常进行讲解,第一种:创建一个新的exception类来拥有自己的异常,第二种:raise 唯一的一个参数指定了要被抛出的异常 1 ...

  2. OAuth 2.0 综述

    OAuth 2.0 rfc6749 规范 OAuth 2.0 rfc6749 规范-带目录,阅读 RFC 文档的 工具 OAuth 官网 OAuth2 核心 角色 Token 类型 access to ...

  3. Drone - 安装,搭配 GitLab 下的配置和使用

    参考资料: Drone 官网地址:https://drone.io Drone 的 GitHub 地址:https://github.com/drone/drone 简介:https://imnerd ...

  4. Java Web项目启动执行顺序

    一. 1.启动一个WEB项目,WEB容器会先去读取它的配置文件web.xml,读取<context-param>和<listener>两个节点. 2.接着,容器创建一个Serv ...

  5. LOJ 2183 / SDOI2015 序列统计 (DP+矩阵快速幂)

    题面 传送门 分析 考虑容斥原理,用总的方案数-不含质数的方案数 设\(dp1[i][j]\)表示前i个数,和取模p为j的方案数, \(dp2[i][j]\)表示前i个数,和取模p为j的方案数,且所有 ...

  6. 【TWRP】使用adb sideload线刷ROM的方法

    本教程详细介绍 手机刷三方ROM 之前需要安装的 TWRP 这个神器工具 楼主的手机是小米,所以此教程以小米手机为例.其他手机原理类似 第一步,解锁引导程序 访问小米的官方解锁网站并申请解锁权限. 等 ...

  7. ArrayList与List<T>的区别

    ArrayList alist = new ArrayList(); //ArrayList(object value),所以ArrayList可以存储任何类型,如果存储值类型的话会进行装箱操作,在操 ...

  8. sudo在清理内存的时候报错

    运行下面语句清缓存时,报Permission denied错误:-bash: /proc/sys/vm/drop_caches: Permission denied sudo echo 1 > ...

  9. 没有找到mspdb80.dll,因此这个应用程序未能启动...问题解决

    这里主要针对使用link.exe进行SIG文件制作时,报错. 首先下载,mspdb80.dll:https://www.lanzous.com/i59dgfi 将dll文件移动到我的电脑(32位)C: ...

  10. git 常用命令与上传步骤

      git 上传步骤: git  init  初始化Git仓库 git  add .  提交你修改的文件 git status  查看项目当中的状态(红色代表的是 未add  的文件    绿色的是已 ...