[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 ...
随机推荐
- 关于float的小奥秘
一. float 存储方式 1.1. float 占四个字节 1.2. 浮点数构成 1.2.1. 无论是单精度还是双精度在存储中都分为三个部分: <1>. 符号位(Sign) : 0代表正 ...
- Luogu P1650 田忌赛马
题目 如果我们最大比对面最大大,那么直接用. 如果我们最小比对面最小大,那么直接用. 否则用我们最小去换对面最大. #include<bits/stdc++.h> using namesp ...
- jquery html select 清空保留第一项
<select id="a"> <option>1</option> <option>2</option> <op ...
- redis 列表 数据类型
列表 rpush dname 技术部 后勤部 售后部 lpush dname 秘书部 lset dname 2 销售部 修改 lrange dname 0 -1 打印所有列表 ...
- 手把手教你用Python搭建自己的量化回测框架【均值回归策略】
手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...
- php点击链接直接下载文件写法
down.php <?php $file = "avater.jpg"; //计算机上的一个文件 $fileName = basename($file); //获取文件名 h ...
- 前端技术之:如何Mock GraphQL接口数据
// 第一步:引入所依赖的库const { makeExecutableSchema, addMockFunctionsToSchema } = require('graphql-tools');co ...
- springboot导包spring-boot-starter-parent出现错误
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot ...
- Python爬虫之定时抢购淘宝商品
Python爬虫之定时抢购淘宝商品 import time from selenium import webdriver import datetime class Spider: def __ini ...
- Librepilot-Spark2固件的烧写
1.通过USB连接Librepilot_Spark2飞控,启动Librepilot GCS地面站(博主的GCS是16.09版本),界面如下. 2.点击Firmware标签页,点击终止系统(若板子未带系 ...