思路 :搜索从第一排开始能覆盖最后一排的区间L ~ R(代码里是x ~ y),但搜索必须满足一个条件才能搜——if(q[1][i - 1] <= q[1][i] && q[1][i + 1] <= q[1][i]),这个条件的原因是如果当前点能覆盖第一排的相邻点,那么选它的相邻点做蓄水厂就没有意义了;而等于号是因为如果它的相邻点覆盖不了它,它就可以选,否则就是无意义的点了。搜索时如果搜到了最后一排,就当前点改为“搜到了”,并存下L和R,L取min,R取max(注意:这里每个点的L和R需要初始化,即L = INF, R = -INF)。搜完以后,判断有没有最后一排的任意一个点没有被改为“搜到了”,如果有就输出“0” + 没有改为“搜到了”的数量。否则就排序 + 贪心区间覆盖——每次贪心取左边界 ≤ l && 右边界 > r的区间(l初始值为1,r初始值为0,然后l每次都重新赋值为r + 1,r反复取 { 左边界 ≤ l && 右边界 > r } 的右边界),最后取最小覆盖的次数(即要安蓄水厂的最小数量)为答案,输出“1” + 最小覆盖的次数。

注:本题建议用深搜,用广搜好像会TLE + MLE

广搜结果:

搜索结果:

 code:

  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3. using namespace std;
  4. int u[][] = {{, -, , }, {, , , -}};
  5. int n, m, q[][], vis[][], visn[], ans, z;//visn[i]表示最后一排第i列的城市有没有灌到水
  6. struct node
  7. {
  8. int x, y;
  9. }stu[];
  10. inline void dfs(int x, int y, int p)//深搜, p表示当前第一排的纵坐标(即要把蓄水厂建到当前位置)
  11. {
  12. vis[x][y] = ;//注意:这个不是最后一排,这个仅仅只是为了不重复搜
  13. if(x == n)//最后一排
  14. {
  15. visn[y] = ;//标记
  16. stu[p].x = min(stu[p].x, y);//min
  17. stu[p].y = max(stu[p].y, y);//max
  18. }
  19. for(register int i = ; i < ; ++i)
  20. {
  21. int nx = x + u[][i];
  22. int ny = y + u[][i];
  23. if(nx >= && nx <= n && ny >= && ny <= m && q[x][y] > q[nx][ny]/*这个很重要,不要打等于号哦*/ && !vis[nx][ny])
  24. {
  25. dfs(nx, ny, p);
  26. }
  27. }
  28. return;
  29. }
  30. inline int cmp(node a, node b)
  31. {
  32. return a.x == b.x ? a.y < b.y : a.x < b.x;//三目运算符大法好
  33. }
  34. int main()
  35. {
  36. scanf("%d %d", &n, &m);
  37. for(register int i = ; i <= n; ++i)
  38. {
  39. for(register int j = ; j <= m; ++j)
  40. {
  41. scanf("%d", &q[i][j]);
  42. }
  43. }
  44. for(register int i = ; i <= m; ++i)//这是纵坐标,所以是m
  45. {
  46. stu[i].x = INF;//初始化
  47. stu[i].y = -INF;
  48. }
  49. for(register int i = ; i <= m; ++i)//这是纵坐标,所以是m
  50. {
  51. if(q[][i - ] <= q[][i] && q[][i + ] <= q[][i])
  52. {
  53. memset(vis, , sizeof(vis));//初始化
  54. dfs(, i, i);
  55. }
  56. }
  57. for(register int i = ; i <= m; ++i)
  58. {
  59. if(!visn[i])//没有灌到水的
  60. {
  61. ++ans;
  62. }
  63. }
  64. if(ans)//有没有灌到水的
  65. {
  66. printf("0\n%d", ans);
  67. return ;
  68. }
  69. for(register int i = ; i <= m; ++i)//重新赋值一遍
  70. {
  71. if(stu[i].x != INF && stu[i].y != -INF)//前提是这个点被安了蓄水厂
  72. {
  73. stu[++z].x = stu[i].x;
  74. stu[z].y = stu[i].y;
  75. }
  76. }
  77. sort(stu + , stu + z + , cmp);//按左端点排序
  78. int l = ;
  79. int j = ;
  80. int r = ;
  81. for(; l <= m/*超了右端点就停止*/; l = r + /*更新左端点*/, r = /*每次赋值为0*/, ++ans/*最小覆盖的次数(蓄水厂的最小数量)*/)//for循环大法好
  82. {
  83. while(stu[j].x <= l)
  84. {
  85. r = max(r, stu[j].y);//取max
  86. ++j;//别忘了继续循环下一个点
  87. }
  88. }
  89. printf("1\n%d", ans);
  90. return ;
  91. }

洛谷 P1514 【引水入城】的更多相关文章

  1. 洛谷P1514 引水入城

    洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...

  2. 洛谷 P1514 引水入城 解题报告

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 NN 行 \times M×M 列的矩形,如上图所示,其中每个格 ...

  3. CODEVS 1066/洛谷 P1514引水入城

    1066 引水入城 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 在一个遥远的国 ...

  4. 洛谷P1514 引水入城 [搜索,区间DP]

    题目传送门 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N 行×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每 ...

  5. 洛谷P1514 引水入城——dfs

    题目:https://www.luogu.org/problemnew/show/P1514 搜索+DP: 自己想出来的方法第一次80分好高兴! 再改了改就A了,狂喜乱舞: 也就是 dfs,仔细一想第 ...

  6. [NOIP2010] 提高组 洛谷P1514 引水入城

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  7. 洛谷 P1514 引水入城

    这次不说闲话了,直接怼题 这道题用bfs其实并不难想,但比较困难的是怎么解决满足要求时输出蓄水厂的数量.其实就像其他题解说的那样,我们可以用bfs将它转化成一个区间覆盖问题,然后再进行贪心. 首先枚举 ...

  8. 洛谷P1514引水入城

    题目 搜索加贪心其实并不需要用到\(DP\),搜索也是比较简单地搜索. 对于每个第一行的城市进行类似于滑雪那道题的搜索,然后记录最后一行它所覆盖的区间,易得一个一行城市只会有一个区间.然后可以在最后进 ...

  9. [luogu]P1514 引水入城[搜索][记忆化][DP]

    [luogu]P1514 引水入城 引水入城 题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形 ,如下图所示,其中每个格 ...

  10. Luogu P1514 引水入城

    我承认我有点懒(洛谷已经发过题解了,但我发誓要坚持写博客) 这道题坑了我3天…… 首先一看就与染色问题类似,果断BFS(写DFS炸了) 先将最上面(靠近水)的一行全部扔进队列里,做一遍BFS 再对最下 ...

随机推荐

  1. bit、byte、kb、mb、g的区别

    1Byte=8bit1KB=1024Byte(字节)=8*1024bit1MB=1024KB1GB=1024MB1TB=1024GB bit是计算机数据的最小单元.要么是0,要么是1. byte 关键 ...

  2. CMD开放3389端口

    REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t R ...

  3. Eclipse中代码自动添加注释及代码注释模板

    介绍 为了提高代码的可读性以及为了有些代码有洁癖的人的需求,我们要从学生到职业进行迈进的过程中,必须把以前的那种代码可读性不高的习惯改掉,因为我们必须要与企业接轨.. 好了,废话不多说,反正就是提升自 ...

  4. spring boot 加载自定义log4j 文件路径

    spring boot 使用log4j 打印时,需首先去除自带 Logger ,然后加入log4j 依赖 <dependencies> <!-- https://mvnreposit ...

  5. 常量Const

    常量Const YEAR = 2019 # 全部大写的变量名为常量 注释 给不能理解的写一个描述 便于理解 增强可读性 三种形式 单行(当行)注释:# 只注释一行 不能换行 注释的代码不执行 不使用 ...

  6. 分析android studio的项目结构

    以最简单的工程为例子,工程名为随意乱打的Exp5,新建好工程后将项目结构模式换成android: 1.manifests AndroidManifest.xml:APP的配置信息 <?xml v ...

  7. xlistview错误

    apply plugin: 'com.android.library' android { compileSdkVersion buildToolsVersion '26.0.1' defaultCo ...

  8. Xlistview_聚合菜谱大全数据

    public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener{ private ...

  9. [Spring cloud 一步步实现广告系统] 2. 配置&Eureka服务

    父项目管理 首先,我们在创建投放系统之前,先看一下我们的工程结构: mscx-ad-sponsor就是我们的广告投放系统.如上结构,我们需要首先创建一个Parent Project mscx-ad 来 ...

  10. React中控制台警告

    1.dll_lib.js:1 Warning: bind(): You are binding a component method to the component. React does this ...