[CSP-S模拟测试]:maze(二分答案+最短路)
题目传送门(内部题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(二分答案+最短路)的更多相关文章
- 【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路
在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景 [题目描述:] 在艾泽 ...
- POJ 3662 Telephone Lines【二分答案+最短路】||【双端队列BFS】
<题目链接> 题目大意: 在一个节点标号为1~n的无向图中,求出一条1~n的路径,使得路径上的第K+1条边的边权最小. 解题分析:直接考虑情况比较多,所以我们采用二分答案,先二分枚举第K+ ...
- bzoj 1614 Telephone Lines架设电话线 - 二分答案 - 最短路
Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...
- P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)
思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...
- 洛谷P1462通往奥格瑞玛的道路——二分答案最短路
题目:https://www.luogu.org/problemnew/show/P1462 最大值最小问题,二分答案. 代码如下: #include<iostream> #include ...
- Luogu P1396 营救【最小生成树/二分答案/最短路】 By celur925
题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门…… 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小 ...
- P1462 通往奥格瑞玛的道路(二分答案+最短路)
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- Luogu P1462 通往奥格瑞玛的道路 二分答案+最短路
先二分答案,再跑最短路,跑的时候遇到 过路费超过二分的答案的 就不拿他更新最短路 #include<cstdio> #include<iostream> #include< ...
- poj-3662 Telephone Lines 二分答案+最短路
链接:洛谷 POJ 题目描述 Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone co ...
随机推荐
- 关于 Spring AOP (AspectJ) 你该知晓的一切 (转)
出处:关于 Spring AOP (AspectJ) 你该知晓的一切
- 简单CSS实现闪烁动画(+1白话讲解)
原文:简单CSS实现闪烁动画(+1白话讲解) 本文转载于:猿2048网站⇒https://www.mk2048.com/blog/blog.php?id=icj2chj2ab 背景 本文承接自上文&l ...
- sql server 函数详解(3)数据类型转换函数和文本图像函数
数据类型转换函数 文本和图像函数 --在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型 ...
- luogu P2093 [国家集训队]JZPFAR
传送门 要维护平面上点的信息,所以可以用KD-tree来维护,然后维护一个大小为\(k\)的堆,每次从根开始遍历,遇到一个点就看能不能作为前\(k\)远的点,也就是看能不能把堆中最近的点给替换掉.如果 ...
- jqery实现10X10的表格,双击消失
<script type="text/javascript"> $(document).ready(function(){ //循环拼接html s="&qu ...
- React中用EChart写面积图
UED出的设计图如下: 实际展示效果如下: 调取的数据如下: "staffCountList":[ { "time":"2019-12-24 17: ...
- javaScript运动框架之缓冲运动
缓冲运动 逐渐变慢,最后停止 距离越远速度越大 速度由距离决定 速度=(目标值-当前值)/缩放系数 存在Bug 速度取整 跟随页面滚动的缓冲侧边栏 潜在问题:目标值不是整数时 缓冲运动的停止条件 ...
- PHP的htmlspecialchars、strip_tags、addslashes
PHP的htmlspecialchars.strip_tags.addslashes是网页程序开发中常见的函数,今天就来详细讲述这些函数的用法: 1.函数strip_tags:去掉 HTML 及 PH ...
- poj 1543 Perfect Cubes (暴搜)
Perfect Cubes Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 15302 Accepted: 7936 De ...
- 第五小节之JAVA IO流
文件:文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件,特别的是指以ASCLL码方式(也称为文本方式)存储的文件,而更确切地说,英文.数字等字符存储的是ASCLL码,而 ...