题目传送门(内部题88)


输入格式

第一行两个数$n,m$。
第二行四个数$sx,sy,tx,ty$。分别表示起点所在行数、列数,终点所在行数、列数。
接下来$n$行,每行$m$个数,描述迷宫。
最后一行一个正实数$s$。


输出格式

输出答案$k$,四舍五入保留$3$位小数。(评测时开启逐行比较模式)


样例

样例输入:

4 4
1 1 4 4
0 0 1 1
1 0 0 0
0 0 1 0
0 0 0 0
5

样例输出:

0.667


数据范围与提示

对于$30\%$的数据:$n,m\leqslant 10$
对于另$10\%$的数据:保证从起点到终点有且只有一条不重复经过同一个点的路径
对于$100\%$的数据:$n,m\leqslant 100,0<s\leqslant 10^5$


题解

考虑为什么决策有单调性:

  $\alpha.$如题,显然只有一组解,所以决策一定单调。

  $\beta.$如果$k>1$,那么随着其不断增大,横向走肯定不断增加,直到极限;反之同理。

所以考虑二分答案$+$最短路就好了。

注意题目中说$s$是实数,即有可能是小数。

时间复杂度:$\Theta(nm\log nm\times log s)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-5;
struct rec{int nxt,to;bool w;}e[100000];
int head[10001],cnt;
int n,m;
int sx,sy,tx,ty;
bool Map[102][102];
int tim[102][102],t;
double dis[10001];
bool vis[10001];
double s;
priority_queue<pair<double,int>,vector<pair<double,int>>,greater<pair<double,int>>>q;
void add(int x,int y,bool w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cnt;
}
void Dij(int x,double w)
{
dis[x]=0.0;
q.push(make_pair(0.0,x));
while(!q.empty())
{
int flag=q.top().second;q.pop();
if(vis[flag])continue;
vis[flag]=1;
for(int i=head[flag];i;i=e[i].nxt)
{
double d=(e[i].w)?w:1.0;
if(dis[e[i].to]>dis[flag]+d)
{
dis[e[i].to]=dis[flag]+d;
q.push(make_pair(dis[e[i].to],e[i].to));
}
}
}
}
bool judge(double mid)
{
for(int i=1;i<=t;i++)
{
vis[i]=0;
dis[i]=1000000000.0;
}
Dij(tim[sx][sy],mid);
if(dis[tim[tx][ty]]<s)return 1;
return 0;
}
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&tx,&ty);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&Map[i][j]);
tim[i][j]=++t;
}
for(int i=0;i<=n+1;i++)Map[i][0]=Map[i][m+1]=1;
for(int i=0;i<=m+1;i++)Map[0][i]=Map[0][n+1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(Map[i][j])continue;
if(!Map[i-1][j]){add(tim[i][j],tim[i-1][j],1);add(tim[i-1][j],tim[i][j],1);}
if(!Map[i+1][j]){add(tim[i][j],tim[i+1][j],1);add(tim[i+1][j],tim[i][j],1);}
if(!Map[i][j-1]){add(tim[i][j],tim[i][j-1],0);add(tim[i][j-1],tim[i][j],0);}
if(!Map[i][j+1]){add(tim[i][j],tim[i][j+1],0);add(tim[i][j+1],tim[i][j],0);}
}
scanf("%lf",&s);
double lft=0.0,rht=s;
while(rht-lft>eps)
{
double mid=(lft+rht)/2;
if(judge(mid))lft=mid;
else rht=mid;
}
printf("%.3lf",lft);
return 0;
}

rp++

[CSP-S模拟测试]:maze(二分答案+最短路)的更多相关文章

  1. 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路

    在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景 [题目描述:] 在艾泽 ...

  2. POJ 3662 Telephone Lines【二分答案+最短路】||【双端队列BFS】

    <题目链接> 题目大意: 在一个节点标号为1~n的无向图中,求出一条1~n的路径,使得路径上的第K+1条边的边权最小. 解题分析:直接考虑情况比较多,所以我们采用二分答案,先二分枚举第K+ ...

  3. bzoj 1614 Telephone Lines架设电话线 - 二分答案 - 最短路

    Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...

  4. P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)

    思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...

  5. 洛谷P1462通往奥格瑞玛的道路——二分答案最短路

    题目:https://www.luogu.org/problemnew/show/P1462 最大值最小问题,二分答案. 代码如下: #include<iostream> #include ...

  6. Luogu P1396 营救【最小生成树/二分答案/最短路】 By celur925

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...

  7. P1462 通往奥格瑞玛的道路(二分答案+最短路)

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  8. Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路

    先二分答案,再跑最短路,跑的时候遇到 过路费超过二分的答案的 就不拿他更新最短路 #include<cstdio> #include<iostream> #include< ...

  9. poj-3662 Telephone Lines 二分答案+最短路

    链接:洛谷 POJ 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone co ...

随机推荐

  1. window下的php命令行输出汉字乱码处理

    1. 在php的代码中加入 header("content-type:text/html;charset=gbk"); 2. 设置命令行的字体 在命令行上右击属性 字体 选择如下字 ...

  2. redis 小结三-数据类型

    redis 的数据类型主要有五种 字符串(String) 哈希表(Hash) 列表(List) 集合(Set ) 有序集合(Sorted Set) 1. 字符串 一个 key 对应一个 value 该 ...

  3. Mac 基于Anaconda的TensorFlow安装笔记

    最近在中国大学MOOC平台学习北大的曹健老师上的“人工智能实践——Tensorflow”课程,开始我的人工智能之旅.第一天,讲解如何搭建实验室环境,我是mac系统,所以只写mac系统上的实验室环境安装 ...

  4. Java Web开发技术教程入门-JSP基本语法和九大内置对象

    这两天气温逐渐升高,好想把自己泡在冰块里······ 恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽恩嗯摁蒽.......今天阅读到了这本书的第四章-JSP基本语法.经过第一天的阅读,我们明白JSP技术是Java Web开 ...

  5. element-ui select 下拉框位置错乱--解决

    element-ui select 下拉框位置错乱 由于使用 element-ui 的 select 组件时,下拉框的位置错乱了. 开始查找问题 通过各种问题查找,发现是 css 问题 css bod ...

  6. [Vue] vue的一些面试题3

    1. vue 组件里的定时器要怎么销毁? 当生命周期销毁后,并没有将组件中的计时器销毁,虽然页面上看不出来,但是如果在控制台打印的话,会发现计时器还在运行,所以要销毁计时器,避免代码一直执行 cons ...

  7. 6.jQuery之类操作不影响原先类,but原生js却是会影响

    注意jQuery和js的区别: <style> .one { width: 200px; height: 200px; background-color: pink; transition ...

  8. luogu P1587 [NOI2016]循环之美

    传送门 首先要知道什么样的数才是"纯循环数".打表可以发现,这样的数当且仅当分母和\(k\)互质,这是因为,首先考虑除法过程,每次先给当前余数\(*k\),然后对分母做带余除法,那 ...

  9. css3之新增伪类

    css3新增了许多伪类,但是IE8以及更低版本的IE浏览器不支持css3伪类,所以在使用时要是涉及到布局等意象全局的样式,应该多考虑一下. 1.elem:nth-child(n) 这个伪类选中父元素下 ...

  10. 60. Permutation Sequence (JAVA)

    The set [1,2,3,...,n] contains a total of n! unique permutations. By listing and labeling all of the ...