洛谷 P2498 [SDOI2012]拯救小云公主 解题报告
P2498 [SDOI2012]拯救小云公主
题目描述
英雄又即将踏上拯救公主的道路……
这次的拯救目标是——爱和正义的小云公主。
英雄来到\(boss\)的洞穴门口,他一下子就懵了,因为面前不只是一只\(boss\),而是上千只\(boss\)。当英雄意识到自己还是等级1的时候,他明白这就是一个不可能完成的任务。
但他不死心,他在想,能不能避开\(boss\)去拯救公主呢,嘻嘻。
\(Boss\)的洞穴可以看成一个矩形,英雄在左下角\((1,1)\),公主在右上角(row,line)\(。英雄为了避开\)boss\(,当然是离\)boss\(距离越远越好了,所以英雄决定找一条路径使到距离\)boss$的最短距离最远。
Ps:英雄走的方向是任意的。
你可以帮帮他吗?
当英雄找到了美丽漂亮的小云公主,立刻就被\(boss\)包围了!!!英雄缓闭双眼,举手轻挥,白光一闪后使用了回城卷轴,回到了城堡,但只有小云公主回去了……因为英雄忘了进入回城的法阵了。
输入输出格式
输入格式:
第一行,输入三个整数,\(n\)表示\(boss\)的数目,\(row\),\(line\)表示矩形的大小;
接下来\(n\)行,每行分别两个整数表示\(boss\)的位置坐标。
输出格式:
输出一个小数,表示英雄的路径离\(boss\)的最远距离,精确到小数点后两位。
感觉这题好神,没见过模型的话。
70pts:
二分答案最远距离,并查集维护boss所在圆是否连通。
复杂度:\(O(log?N^2)\)
期望得分:70 实际得分:70~100
100pts:
(1) 最小生成树
这样去看,英雄通过这个平面图,实际上只有两种类型。
一是穿过个两个boss之间的地方,这时我们走两个boss之间最中间的地方是最划算的。
二是穿过边界和boss之间的地方,这时我们贴着边界走是最划算的。
我们有很多个这样的地方可以走,走哪些我们可以确定既可以穿过去所有的boss又能使它距离我们最远呢?
如果我们把这些点(包括边界抽象出来的点)连成一条链
我们可以选择一个最优的方案,从中间穿过去
然而仔细想想,如果通过了另外的两点比最大距离还小的点,那不就废了吗?
换一种角度理解好了
按照\(kruskal\)的方法,我们一个一个从小到大加边
当上面的边和下面的边所代表的虚点(实际上有四种情况)连通时,我们就不得不对这条链(实际形态应该是树的连接两个虚点的链)上的某一边做出选择了,这时候我们选择之中最大的走,也不会遇到更小的两点距离了
注意如果是boss和Boss之间的边权要除2(走中间)
然而这个题只可以用prim算法(稠密图)
复杂度:\(O(N^2)\)
期望得分:100 实际得分:100
(2) SPFA
实质上SPFA也只是求得了这条在最小生成树上的最大边的权值。
我们跑0点到n+1点(两个虚点)之间的每条路径上最长的边其中的最小值
注意松弛目的是最小值,但松弛时是从前面的边的最小值和当前边选出一个最大的
复杂度:\(O(N^2)\) (建图)
期望得分:100 实际得分:100
贴一下SPFA的代码吧
#include <cstdio>
#include <cmath>
#include <queue>
double min(double x,double y){return x<y?x:y;}
double max(double x,double y){return x>y?x:y;}
const int N=3050;
double g[N][N],dis[N],x[N],y[N],n,m;
int num,used[N];
double get(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))/2;
}
void init()
{
scanf("%d%lf%lf",&num,&n,&m);
for(int i=1;i<=num;i++)
scanf("%lf%lf",x+i,y+i);
for(int i=1;i<=num;i++)
for(int j=i+1;j<=num;j++)
g[i][j]=g[j][i]=get(x[i],y[i],x[j],y[j]);
for(int i=1;i<=num;i++)
{
g[0][i]=g[i][0]=min(x[i]-1,m-y[i]);
g[i][num+1]=g[num+1][i]=min((n-x[i]),y[i]-1);
}
g[0][num+1]=g[num+1][0]=1e233;
dis[0]=0;
for(int i=1;i<=num+1;i++)
dis[i]=1e233;
}
void spfa()
{
std::queue <int > q;
q.push(0);
while(!q.empty())
{
int u=q.front();
q.pop();used[u]=0;
for(int i=1;i<=num+1;i++)
{
if(i==u) continue;
if(dis[i]>max(dis[u],g[u][i]))
{
dis[i]=max(dis[u],g[u][i]);
if(!used[i])
{
used[i]=1;
q.push(i);
}
}
}
}
}
int main()
{
init();
spfa();
printf("%.2lf",dis[num+1]);
return 0;
}
2018.7.12
洛谷 P2498 [SDOI2012]拯救小云公主 解题报告的更多相关文章
- 洛谷P2498 [SDOI2012]拯救小云公主 【二分 + 并查集】
题目 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1 ...
- P2498 [SDOI2012]拯救小云公主
\(\color{#0066ff}{ 题目描述 }\) 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只bos ...
- 二分+并查集【bzoj3007】[SDOI2012]拯救小云公主
Description 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意 ...
- [SDOI2012]拯救小云公主
题解: 是一个不错的题目 首先我们可以考虑二分答案 然后变成判定性问题 对于每个画一个圆 当其会被阻断时就是答案 阻断有四种情况 左下 上下 左右 右上 但是这样是n^2a(n)*logn的 考虑直接 ...
- BZOJ 3007 [SDOI2012]拯救小云公主 - 对偶图 + 并查集
Solution 答案具有单调性, 显然可以二分答案. 有两个注意点 : 英雄是可以随便走的, 也就是不是网格图... 还有坐标不能小于$1$ QAQ 开始时英雄在左下角, 公主在右上角, 我们反过来 ...
- 【BZOJ】【3007】拯救小云公主
思路题 我的naive的做法是二分答案+判定是否有路径可走……但是没有正确理解[走的方向任意]这句话…… 其实就是说想咋走咋走= =360°无死角乱走…… 所以其实是个平面上的问题…… 我们可以换个方 ...
- BZOJ:4219: 跑得比谁都快 3007: 拯救小云公主
4219: 跑得比谁都快 3007: 拯救小云公主 三角剖分的解释可以看这里:http://www.cnblogs.com/Enceladus/p/6706444.html 后一道是前一道的弱化版. ...
- 【BZOJ3007】拯救小云公主 二分+几何+对偶图
[BZOJ3007]拯救小云公主 Description 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了 ...
- bzoj3007: 拯救小云公主
Description 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是 ...
随机推荐
- 了解ASP.NET Core 依赖注入,看这篇就够了
DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET Core的DI实现以及对实例 ...
- 【转】glumer Appium + Python环境搭建(移动端自动化)
最近整理了一下自动化的东西,好久没搭建环境又踩了不少坑,appium的环境搭建比较繁琐,好多同行估计都在环境上被卡死了.分享一下~~ 一.安装JDK,配置JDK环境 百度搜索下载就行,这里分享一 ...
- MySQL☞左外链接与右外连接
外链接查询:即要查询有关联关系的数据,还要查询没有关联关系的数据.(个人理解为:表A和表B两个关联的列中)如下图: emmm,简单的来说两个表的关联关系:book.bid=bookshop.id,他们 ...
- DataRow的RowState属性变化
DataRow的RowState属性(状态)取值有5种:Detached, Unchanged, Added, Deleted, Modified. 当我们用DataRow newRow = Data ...
- Ubuntu用户设置文件说明
Ubuntu用户设置文件说明 Ubuntu作为Linux的一个发行版本,自然具有Linux系统的多用户特性.因为经常会使用和管理Ubuntu的用户,现将Ubuntu系统下的User的个性化配置整理如下 ...
- [network]RIP协议
水平分割:一种避免路由环路的出现和加快路由汇聚的技术. 原理:路由器从某个接口接收到的更新信息不允许再从这个接口发送回去. 优点:1. 阻止路由环路产生:2. 减少路由器更新信息占用的链路带宽资源. ...
- [朴孝敏][Gold]
歌词来源:http://music.163.com/#/song?id=406924220 作曲 : Ryan S. Jhun/David Quinones/Edwin Menjivar/Mateo ...
- GIT团队实战博客
项目要求 组长博客 遇到的困难及解决办法 组员1(组长):王彬 遇到的困难 在团队任务分工的时候没有充分照顾到所有人,导致队员们的工作量不均. 现场编程时间不够 解决办法 在此对组员们表示抱歉,由于 ...
- Scrum团队成立及《构建之法》第六、七章读后感
5.Scrum团队成立 5.1 团队名称:喳喳 团队目标:突破渣渣 团队口号:吱吱喳喳 团队照: 5.2 角色分配 产品负责人: 112冯婉莹 Scrum Master: ...
- 【week10】规格说明书练习-吉林市1日游
假设我们全班同学及教师去吉林省吉林市1日游,请为这次活动给出规格说明书. 版本:1.0 编订:于淼 团队:2016级计算机技术全体同学 日期:2016/11/19 1.引言 1.1 编写目的 1.2 ...