题目传送门(内部题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. pandas中的数据结构-DataFrame

    pandas中的数据结构-DataFrame DataFrame是什么? 表格型的数据结构 DataFrame 是一个表格型的数据类型,每列值类型可以不同 DataFrame 既有行索引.也有列索引 ...

  2. 洛谷 P1484 种树 题解

    题面 这是一道标准的带反悔贪心: 利用大根堆来维护最大值: 当选择了num[i]后,反悔了,反之选择选了num[i-1]和num[i+1]时获利便增加了num[i-1]+num[i+1]-num[i] ...

  3. Maven build 命令介绍(转)

    常用命令: 打包:mvn package编译:mvn compile清空:mvn clean(清除编译后目录,默认是target目录)运行测试:mvn test安装jar包到本地仓库中:mvn ins ...

  4. webpack常用的插件

    webpack常用的开发插件 1.clean-webpack-plugin 运行webpack build时先把打包进入的文件夹清空 注意,它是以对象的方式去接收的 const { CleanWebp ...

  5. gulp.js实现less批量实时编译

    问题描述: 在之前一直用Koala编译less文件,但本人感觉Koala用起来非常麻烦,好像不能做多个less文件的批量的编译:因为目前项目也没有用到webpack,我的less是通过vs code ...

  6. FP Style 的快排

    const quickSort = (list) => { if (!list || !list.length) return []; if (list.length === 1) return ...

  7. SecureCRT文件和文件夹显示不同颜色(像linux中那样效果)

    如何设置secureCRT使用的他可以像linux文件和文件夹显示不同的颜色呢 原先显示效果如下: 效果图 配置

  8. 009-saltstack之salt-ssh的使用及配置管理LAMP状态的实现

    1.salt-ssh的使用 官方文档:https://docs.saltstack.com/en/2016.11/topics/ssh/index.html (1)安装salt-ssh [root@l ...

  9. small task

    task:use c89 draw turtle result:

  10. Python:JPG->JPEG

    由于要在网页上使用图片渐进加载,所以需要将其他图片格式转化为JPEG格式 考虑使用python来实现批量转换 需要先安装pillow: pip  install pillow 我这里将JPG格式转化为 ...