思路 :搜索从第一排开始能覆盖最后一排的区间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:

 #include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int u[][] = {{, -, , }, {, , , -}};
int n, m, q[][], vis[][], visn[], ans, z;//visn[i]表示最后一排第i列的城市有没有灌到水
struct node
{
int x, y;
}stu[];
inline void dfs(int x, int y, int p)//深搜, p表示当前第一排的纵坐标(即要把蓄水厂建到当前位置)
{
vis[x][y] = ;//注意:这个不是最后一排,这个仅仅只是为了不重复搜
if(x == n)//最后一排
{
visn[y] = ;//标记
stu[p].x = min(stu[p].x, y);//min
stu[p].y = max(stu[p].y, y);//max
}
for(register int i = ; i < ; ++i)
{
int nx = x + u[][i];
int ny = y + u[][i];
if(nx >= && nx <= n && ny >= && ny <= m && q[x][y] > q[nx][ny]/*这个很重要,不要打等于号哦*/ && !vis[nx][ny])
{
dfs(nx, ny, p);
}
}
return;
}
inline int cmp(node a, node b)
{
return a.x == b.x ? a.y < b.y : a.x < b.x;//三目运算符大法好
}
int main()
{
scanf("%d %d", &n, &m);
for(register int i = ; i <= n; ++i)
{
for(register int j = ; j <= m; ++j)
{
scanf("%d", &q[i][j]);
}
}
for(register int i = ; i <= m; ++i)//这是纵坐标,所以是m
{
stu[i].x = INF;//初始化
stu[i].y = -INF;
}
for(register int i = ; i <= m; ++i)//这是纵坐标,所以是m
{
if(q[][i - ] <= q[][i] && q[][i + ] <= q[][i])
{
memset(vis, , sizeof(vis));//初始化
dfs(, i, i);
}
}
for(register int i = ; i <= m; ++i)
{
if(!visn[i])//没有灌到水的
{
++ans;
}
}
if(ans)//有没有灌到水的
{
printf("0\n%d", ans);
return ;
}
for(register int i = ; i <= m; ++i)//重新赋值一遍
{
if(stu[i].x != INF && stu[i].y != -INF)//前提是这个点被安了蓄水厂
{
stu[++z].x = stu[i].x;
stu[z].y = stu[i].y;
}
}
sort(stu + , stu + z + , cmp);//按左端点排序
int l = ;
int j = ;
int r = ;
for(; l <= m/*超了右端点就停止*/; l = r + /*更新左端点*/, r = /*每次赋值为0*/, ++ans/*最小覆盖的次数(蓄水厂的最小数量)*/)//for循环大法好
{
while(stu[j].x <= l)
{
r = max(r, stu[j].y);//取max
++j;//别忘了继续循环下一个点
}
}
printf("1\n%d", ans);
return ;
}

洛谷 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. context创建过程解析(一)之deployDescriptors

    总结:主要是创建Context对象,并且将默认context配置,host级别配置,context配置的值设置进去,设置docBase,如果是war包就解压到webapp的目录中,重新设置docBas ...

  2. C语言编程入门之--第三章编写第一个C语言程序

    第三章 编写第一个C语言程序 导读:一般学一门计算机语言的第一堂上机课(“上机”顾名思义,上了计算机),就是往屏幕输出“hello world”,本章也不例外. 1.1 Hello,World! 这一 ...

  3. 异常处理 _this.setData is not a function

    _this.setData is not a function;at api request success callback function TypeError: _this.setData is ...

  4. Angular JS 中 指令详解

    Angular JS的强大功能就在于其可以自定义很多指令,现在就指令做一下详细的剖析. 一个Angular js 指令(directive)需要指定一个唯一的名字(myDirective)和一个函数, ...

  5. 续集:白菜的内涵,更新nand分区为ubifs,替换overlay

    在上一篇真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记中附带了128M nand的空间图示,在ar71xx profil ...

  6. 【NOI 2015】程序自动分析 并查集与离散化处理

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...

  7. Extjs的textfield的颜色设置和出现的问题笔记

    Ext.getCmp('alarmsLevelVal').setFieldStyle('background-color:#ff0000;background-p_w_picpath: none; ' ...

  8. Java----面向对象(继承&多态)

    一.继承 什么是继承 ? 让类与类之间产生了子父类关系 ; 继承的好处是: 提高代码的复用性和维护性 java中继承的特点是: 只支持单继承.不支持多继承,但是可以多层继承; 四种权限修饰符是 : p ...

  9. Java 8原生API也可以开发响应式代码?

    前段时间工作上比较忙,这篇文章一直没来得及写,本文是阅读<Java8实战>的时候,了解到Java 8里已经提供了一个异步非阻塞的接口(CompletableFuture),可以实现简单的响 ...

  10. android ——调用摄像头拍照和相册

    先在布局文件中加入两个按钮和一个图片控件 <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...