滑雪场的高度差

时间限制: 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( ( ...... ) ) 。

以下代码:(考察良心的时候到了)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<cstring>
  6. #define abs(x) (x < 0 ? -x : x)
  7. using namespace std;
  8. void read(int &x) {
  9. int f = 1;x = 0;char s = getchar();
  10. while(s < '0' || s > '9') {if(s == '-')f = -1;s = getchar();}
  11. while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
  12. x *= f;
  13. }
  14. struct no{
  15. int x,y;
  16. no(){}
  17. no(int X,int Y){
  18. x = X;y = Y;
  19. }
  20. };
  21. int n,m,s,o,i,j,k,ans = 0,nm,fx,fy,ji = 0;
  22. int a[505][505],d[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
  23. bool f[505][505],v[505][505];
  24. bool bfs(int xx) {
  25. memset(f,0,sizeof(f));
  26. ji = 0;
  27. queue<no> b;
  28. b.push(no(fx,fy));
  29. f[fx][fy] = 1;
  30. while(!b.empty()) {
  31. no t = b.front();
  32. b.pop();
  33. if(v[t.x][t.y]) {
  34. ji ++;
  35. }
  36. if(ji == nm) {
  37. return 1;
  38. }
  39. for(int i = 0;i < 4;i ++) {
  40. no t1 = t;
  41. t1.x += d[i][0];
  42. t1.y += d[i][1];
  43. 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) {
  44. f[t1.x][t1.y] = 1;
  45. b.push(t1);
  46. }
  47. }
  48. }
  49. return 0;
  50. }
  51. int js(int l,int r) {
  52. int mid = (l + r) / 2;
  53. while(l < r) {
  54. bool ff = bfs(mid);
  55. if(ff) r = mid;
  56. else l = mid + 1;
  57. mid = (l + r) / 2;
  58. }
  59. return mid;
  60. }
  61. int main() {
  62. read(n);read(m);
  63. for(i = 1;i <= n;i ++) {
  64. for(j = 1;j <= m;j ++) {
  65. read(a[i][j]);
  66. o = max(o,a[i][j]);
  67. }
  68. }
  69. for(i = 1;i <= n;i ++) {
  70. for(j = 1;j <= m;j ++) {
  71. read(k);
  72. if(k == 1) v[i][j] = 1,fx = i,fy = j,nm ++;
  73. }
  74. }
  75. printf("%d",js(0,o));
  76. return 0;
  77. }

(四连测)滑雪场的高度差题解---二分 + 搜索---DD(XYX)​​​​​​​的博客的更多相关文章

  1. 拥挤的奶牛题解---队列优化DP---DD(XYX)​​​​​​​的博客

    拥挤的奶牛 时间限制: 1 Sec  内存限制: 128 MB 题目描述 FJ的n头奶牛(1<=n<=50000)在被放养在一维的牧场.第i头奶牛站在位置x(i),并且x(i)处有一个高度 ...

  2. Magazine Ad CodeForces - 803D(二分 + 贪心,第一次写博客)

    Magazine Ad The main city magazine offers its readers an opportunity to publish their ads. The forma ...

  3. MariaDB第四章:视图,事务,索引,外键--小白博客

    视图 对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦 假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结 ...

  4. 弹簧高跷题解---双向DP---DD(XYX)​​​​​​​的博客

    三 . 弹簧高跷 时间限制: 1 Sec  内存限制: 128 MB 题目描述.输入.输出          ----------- 方法 这道题用DP是可以解决的.因为每一次跳跃都与前一次跳跃有关, ...

  5. 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 百篇博客分析OpenHarmony源码 | v49.04

    百篇博客系列篇.本篇为: v49.xx 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...

  6. OO第四单元博客

    第四单元博客 这个单元的作业,emmmm助教们做的工作还是一如既往的多,我们只负责添一添代码,最后一次作业了,感谢各位助教和老师,同时也希望我能顺利通过这最后一关. 架构设计 第一次作业架构展示 第一 ...

  7. BUAA_OO_博客作业四

    BUAA_OO_博客作业四 1 第四单元两次作业的架构设计 1.1 第13次作业 类图 ​ 作业要求:通过实现UmlInteraction这个官方提供的接口,来实现自己的UmlInteraction解 ...

  8. OO第四次博客作业(第四单元作业及期末总结)

    (注意:本文写作顺序与作业要求不完全一致,但涵盖了作业的所有要求) 一学期的BUAA特色OO课程结束了. PART 1  我想先写我这一学期的感想 从第一单元满怀期待地写完多项式求值到最后看着60分不 ...

  9. OOP第四章博客

    OOP第四章博客作业 (1)本单元作业架构设计 1)针对于第一次作业,我是将所给类进行了自己的封装,在MyUmlInteraction类里面进行关系的建立,这里把所给的UmlClass建立好,同时有i ...

随机推荐

  1. np.linspace,numpy中的linspace()

    import numpy as np x=np.linspace(1,10) y=np.linspace(1,10,num=10,retstep=True)#num可省略 print(x) print ...

  2. 技术分享 | app自动化测试(Android)--App 控件定位

    原文链接 客户端的页面通过 XML 来实现 UI 的布局,页面的 UI 布局作为一个树形结构,而树叶被定义为节点.这里的节点也就对应了要定位的元素,节点的上级节点,定义了元素的布局结构.在 XML 布 ...

  3. 腾讯视频的qlv格式转换为mp4格式

    1.点击设置->下载设置->缓存管理 下的文件目录复制; 2复制在 我的电脑路径栏目中 找到缓存目录 文件夹vodcache; 3.打开视频对应文件; 4.打开cmd命令窗口 5.跳转 到 ...

  4. Vue.js与ElementUI搭建无限级联层级表格组件

    前言 今天,回老家了.第一件事就是回家把大屏安排上,写作的感觉太爽了,终于可以专心地写文章了.我们今天要做的项目是怎么样搭建一个无限级联层级表格组件,好了,多了不多说,赶快行动起来吧!项目一览 到底是 ...

  5. 数字格式化的 js 库

    数字格式化的 js 库 Numeral.js,是一个用于格式化数字和处理数字的 js 库. Tip:目前 Star 有 9.2k,5年以前就没有在更新.其文档写得不很清晰,比如它提供了多语言,但如何切 ...

  6. Redis布隆过滤器和布谷鸟过滤器

    一.过滤器使用场景:比如有如下几个需求:1.原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中? 解决办法一:将10亿个号码存入数据库中,进行数据库查询,准 ...

  7. CentOS7使用LVM缩减/home空间,扩大/空间

    CentOS7使用LVM缩减/home空间,扩大/空间方法:把/home里的内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/文件系统.新建/home,恢复/home的原内容1.查看默认分区[ ...

  8. JDBC: ThreadLocal 类

    1.ThreadLocal ThreadLocal用于保存某个线程共享变量.在Java中,每个线程对象都有一个ThreadLocal<ThreadLocal,Object>,其中key就是 ...

  9. 线程池的概念&原理和线程池的代码实现

    线程池:一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作, 无需反复创建线程而消耗过多资源.工作原理:可以用一张图来简洁明了说明: 合理利用线程池能够带来三个好处∶1.降低 ...

  10. elasticsearchTemplate that could not be found

    ***************************APPLICATION FAILED TO START*************************** Description: Metho ...