(四连测)滑雪场的高度差题解---二分 + 搜索---DD(XYX)的博客
滑雪场的高度差
时间限制: 1 Sec 内存限制: 128 MB
题目描述
滑雪场可以看成M x N的网格状山地(1 <= M,N <= 500),每个网格是一个近似的平面,具有水平高度值在0 .. 1,000,000,000米的范围内。
某些网格被指定为关键网格。当两个相邻网格之间的高度差的绝对值不超过某个参数D时,就可以相互到达。相邻关系是指某个格子的东、西、南、北的格子。
显然,当D不断减小时,原本可以相互到达的相邻格子就不能到达了。
滑雪赛的组委会想知道,为了保证各个关键网格之间彼此连通,最小的D是多少?
输入
第1行:2个整数M和N
接下来M行,每行N个整数,表示各网格的高度
接下来M行,每行N个0或者1,1表示关键网格
输出
第1行:1个整数,表示最小的D
方法
因为这题和二分求解有一个共同点。即 若 D = x 时,关键网格之间彼此连通,则 D = (x + 1) 时,关键网格之间肯定更彼此连通,所以就跟 “ 在单调序列中寻找值 ” 有相同点了。故此题要用二分 + 搜索 求解。
(XYF:)至于搜索,优选bfs(节省时间)。在合法情况下搜索一次(起点下文解释),存哪些网格经历过,最后再判断是否经过了所有关键网格。起点最先想到的肯定是从每一个关键网格出发,看看从它开始搜索,在合法情况下是否能经过所有关键网格(输入时可以用结构体,存下每一个关键网格的坐标,关键网格的数量)。但试想,从任意一个关键网格出发,如果它能经过所有关键网格,这个mid就是可以采用的呢?因为假如从某一关键网格(x,y)出发,它通过某一路径经过一个关键网格(m,n),那么从(m,n)出发也一定能通过这个路径,以现在的 mid 经过(x,y)。所以假如(x,y)能经过所有的关键网格,那么(m,n)也一定能经过所有的关键网格(它先沿某一路径到达(x,y))。所以只用从任意一个关键网格开始搜索,再判断。如果它经过了所有关键网格,bfs() 返回true,不然返回false。
其中有一些小坑,曾经把我害的惨,
1,要用 bfs 的话,vis[][] 的计算,清空,判断很重要。
2,二分防爆。
-> 3,若要用 “ while(l < r) ” 的人注意,退出循环后,mid 还没更新成 (l + r) / 2,除非在循环节末尾更新 mid ,不然不能直接输出 mid 。
4,判断绝对值 abs() 函数最好不要用宏定义,不然要错,除非使用时这样写:abs( ( ...... ) ) 。
以下代码:(考察良心的时候到了)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#define abs(x) (x < 0 ? -x : x)
using namespace std;
void read(int &x) {
    int f = 1;x = 0;char s = getchar();
    while(s < '0' || s > '9') {if(s == '-')f = -1;s = getchar();}
    while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
    x *= f;
}
struct no{
    int x,y;
    no(){}
    no(int X,int Y){
        x = X;y = Y;
    }
};
int n,m,s,o,i,j,k,ans = 0,nm,fx,fy,ji = 0;
int a[505][505],d[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
bool f[505][505],v[505][505];
bool bfs(int xx) {
    memset(f,0,sizeof(f));
    ji = 0;
    queue<no> b;
    b.push(no(fx,fy));
    f[fx][fy] = 1;
    while(!b.empty()) {
        no t = b.front();
        b.pop();
        if(v[t.x][t.y]) {
            ji ++;
        }
        if(ji == nm) {
            return 1;
        }
        for(int i = 0;i < 4;i ++) {
            no t1 = t;
            t1.x += d[i][0];
            t1.y += d[i][1];
            if(!f[t1.x][t1.y] && t1.x > 0 && t1.x <= n && t1.y > 0 && t1.y <= m && abs((a[t1.x][t1.y] - a[t.x][t.y])) <= xx) {
                f[t1.x][t1.y] = 1;
                b.push(t1);
            }
        }
    }
    return 0;
}
int js(int l,int r) {
    int mid = (l + r) / 2;
    while(l < r) {
        bool ff = bfs(mid);
        if(ff) r = mid;
        else l = mid + 1;
        mid = (l + r) / 2;
    }
    return mid;
}
int main() {
    read(n);read(m);
    for(i = 1;i <= n;i ++) {
        for(j = 1;j <= m;j ++) {
            read(a[i][j]);
            o = max(o,a[i][j]);
        }
    }
    for(i = 1;i <= n;i ++) {
        for(j = 1;j <= m;j ++) {
            read(k);
            if(k == 1) v[i][j] = 1,fx = i,fy = j,nm ++;
        }
    }
    printf("%d",js(0,o));
    return 0;
}
 (四连测)滑雪场的高度差题解---二分 + 搜索---DD(XYX)的博客的更多相关文章
- 拥挤的奶牛题解---队列优化DP---DD(XYX)的博客
		拥挤的奶牛 时间限制: 1 Sec 内存限制: 128 MB 题目描述 FJ的n头奶牛(1<=n<=50000)在被放养在一维的牧场.第i头奶牛站在位置x(i),并且x(i)处有一个高度 ... 
- Magazine Ad  CodeForces - 803D(二分 + 贪心,第一次写博客)
		Magazine Ad The main city magazine offers its readers an opportunity to publish their ads. The forma ... 
- MariaDB第四章:视图,事务,索引,外键--小白博客
		视图 对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦 假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结 ... 
- 弹簧高跷题解---双向DP---DD(XYX)的博客
		三 . 弹簧高跷 时间限制: 1 Sec 内存限制: 128 MB 题目描述.输入.输出 ----------- 方法 这道题用DP是可以解决的.因为每一次跳跃都与前一次跳跃有关, ... 
- 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 百篇博客分析OpenHarmony源码 | v49.04
		百篇博客系列篇.本篇为: v49.xx 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ... 
- OO第四单元博客
		第四单元博客 这个单元的作业,emmmm助教们做的工作还是一如既往的多,我们只负责添一添代码,最后一次作业了,感谢各位助教和老师,同时也希望我能顺利通过这最后一关. 架构设计 第一次作业架构展示 第一 ... 
- BUAA_OO_博客作业四
		BUAA_OO_博客作业四 1 第四单元两次作业的架构设计 1.1 第13次作业 类图  作业要求:通过实现UmlInteraction这个官方提供的接口,来实现自己的UmlInteraction解 ... 
- OO第四次博客作业(第四单元作业及期末总结)
		(注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1 我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ... 
- OOP第四章博客
		OOP第四章博客作业 (1)本单元作业架构设计 1)针对于第一次作业,我是将所给类进行了自己的封装,在MyUmlInteraction类里面进行关系的建立,这里把所给的UmlClass建立好,同时有i ... 
随机推荐
- php公立转农历
			<?php function nongli($riqi) { //优化修改 20160807 FXL $nian=date('Y',strtotime($riqi)); $yue=date('m ... 
- Python中的类变量和成员变量
			类变量 定义 在类里面定义,且不位于构造或者成员函数里面,同时没有" self. " 的前缀:或者在类外定义,用 类名.类变量名 来新增加类变量. 使用 两种使用方法: (1)类名 ... 
- 利用XtraDiagram.DiagramControl进行流程图形的绘制和控制
			DevExpress提供了一个比较强大的图形绘制工具,可以用于绘制各种图形,如流程图.组织机构图等等,本篇随笔介绍XtraDiagram.DiagramControl的使用,以及利用代码对其属性进行控 ... 
- 关于vue cli 使用iview 自定义主题遇到的坑
			定制主题,这里讲变量覆盖 当你老老实实的把上面文档中的代码一一复制粘贴到项目文件中时,发现了还没装less,所以你就 npm install less –savenpm install less-lo ... 
- SAP Web Dynpro-使用服务调用
			创建服务调用后,功能模块可用于组件. 现在可以选择一个视图,以便在浏览器中显示数据库表的元素. 如果全局控制器不是组件控制器,则必须为所选视图的控制器输入全局控制器的使用页面. 之后,应该有该节点的映 ... 
- NC53681 「土」巨石滚滚
			NC53681 「土」巨石滚滚 题目 题目描述 帕秋莉掌握了一种土属性魔法 她使用这种魔法建造了一个大型的土球,并让其一路向下去冲撞障碍 土球有一个稳定性 \(x\) ,如果 \(x < 0\) ... 
- Linux-Day01
			Linux-Day01 课程内容 Linux简介 Linux安装 Linux常用命令 1. 前言 1.1 什么是Linux Linux是一套免费使用和自由传播的操作系统.说到操作系统,大家比较熟知的应 ... 
- SpringMVC-01
			1. 概述 1.1 概念 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 优点 使用简单,开发便捷(相比于Servlet) 灵活性强 项目请求响应架构演进: 软件三层 软件三层 ... 
- 乘风破浪,遇见未来新能源汽车(Electric Vehicle)之特斯拉提车必须知道的十个流程
			订车 线下门店或者官网可以咨询和下单,一般来说,订金就是1000,还算可以接受. 订单账号 特斯拉账号是以邮箱为区分的,而不是手机号,我们下单的时候需要提供一个邮箱用来注册特斯拉账号. 注意了,敲黑板 ... 
- java字符串类型数学运算表达式以及精度丢失问题
			字符串类型数学运算精度丢失问题 方式一:ScriptEngine 会精度丢失,可执行连续双括号 方式二:hutool ScriptUtil 会精度丢失,可执行连续双括号 方式三:hutool Scri ... 
