我承认我有点懒(洛谷已经发过题解了,但我发誓要坚持写博客)

这道题坑了我3天……

首先一看就与染色问题类似,果断BFS(写DFS炸了)

先将最上面(靠近水)的一行全部扔进队列里,做一遍BFS

再对最下面(远离水)的一行进行扫描,如果发现有点搜索不到,输出0并统计个数退出(很好说明:如果全部修建都无法完成那么使用更少的点是不可能的)

如果可以,就进行第二遍BFS

把第一行每个点分别扔进队列,搜索出它在最下面的可以供水的区间

等等,为什么是区间?

这个很好证明,有多位大佬已经详细证明,我简单说一下

如果这个区间间断了,那么这个间断的点就会比周围的点海拔都高,那么就会产生无解的情况,因为已经证明有解,所以不可能出现这种情况

所以,我们统计所有的区间,做一遍区间覆盖即可

方法很多,DP或者贪心

我打的是贪心,记录最优的区间尾端点

具体看代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define maxn 505
using namespace std;
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
struct data
{
int x,y;
}a[maxn]; //记录区间
int comp(data a,data b) { return a.x<b.x; }
const int fx[]={,,,-},fy[]={,,-,};
int map[maxn][maxn],n,m,i,j,q[maxn*maxn*+][],tot,ans,k,t1,t2;
bool f[maxn][maxn],flag=;
int main()
{
read(n); read(m);
for (i=;i<=n;++i)
for (j=;j<=m;++j)
read(map[i][j]);
memset(f,true,sizeof(f));
int head=,tail=;
for (j=;j<=m;++j)
f[][j]=,q[++tail][]=,q[tail][]=j;
while (head++<tail) //第一遍BFS判断是否有解
{
for (i=;i<;++i)
{
int xx=q[head][]+fx[i],yy=q[head][]+fy[i];
if (f[xx][yy]&&xx>&&yy>&&xx<=n&&yy<=m&&map[xx][yy]<map[q[head][]][q[head][]])
{
f[xx][yy]=;
q[++tail][]=xx; q[tail][]=yy;
}
}
}
for (j=;j<=m;++j)
if (f[n][j]) { flag=; tot++; }
if (flag)
{
puts("");
printf("%d",tot);
return ;
}
for (j=;j<=m;++j) //对每个点都做一遍BFS,由于数据不大,可以水过
{
memset(f,true,sizeof(f));
f[][j]=;
head=; tail=;
q[][]=; q[][]=j;
while (head++<tail)
{
for (i=;i<;++i)
{
int xx=q[head][]+fx[i],yy=q[head][]+fy[i];
if (f[xx][yy]&&xx>&&xx<=n&&yy>&&yy<=m&&map[xx][yy]<map[q[head][]][q[head][]])
{
q[++tail][]=xx; q[tail][]=yy;
f[xx][yy]=;
}
}
}
t1=t2=;
for (i=;i<=m;++i)
if (!f[n][i]) { t1=i; break; }
if (!t1) continue;
for (;i<=m+;++i)
if (f[n][i]) { t2=i-; break; }
a[++k].x=t1; a[k].y=t2; //记录可以到达的区间
}
sort(a+,a+k+,comp);
puts("");
i=; int last=;
while (last<=m)
{
int t=;
while (a[i].x<=last) t=max(a[i++].y,t);
last=t+; ans++;
} //贪心跑一遍区间覆盖模板
printf("%d",ans);
return ;
}

难度不大吧,就是很

Luogu P1514 引水入城的更多相关文章

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

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

  2. 【luogu P1514 引水入城】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1514 // luogu-judger-enable-o2 #include <iostream> ...

  3. Luogu P1514引水入城【搜索】 By cellur925

    题目传送门 这道题开始看好像并没有什么思路,和搜索好像也并没有什么关系.但是我们手玩下样例就会发现,思路其实就三句话:(写这道题的时候在代码里写的) //我们想知道从第1行的每列往下到干旱区的范围 / ...

  4. [NOIp2010] luogu P1514 引水入城

    跟 zzy, hwx 等人纠结是否回去上蛋疼的董老板的课. 题目描述 如图所示.你有一个 N×MN\times MN×M 的矩阵,水可以从一格流到与它相邻的格子,需要满足起点的海拔严格高于终点海拔.定 ...

  5. LUOGU P1514 引水入城 (bfs)

    传送门 解题思路 拉了很长的战线,换了好几种写法终于过了..首先每个蓄水场一定是对沙漠造成连续一段的贡献,所以可以$bfs$出每种状态,然后做一次最小区间覆盖,但这样的复杂度有点高.就每次只搜那些比左 ...

  6. Luogu 1514 引水入城 (搜索,动态规划)

    Luogu 1514 引水入城 (搜索,动态规划) Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图 ...

  7. 洛谷P1514 引水入城

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

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

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

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

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

随机推荐

  1. JMeter—系统性能分析思路(十三)

    参考<全栈性能测试修炼宝典JMeter实战>第九章 性能监控诊断 第二节 系统性能分析思路和第三节 定位分析 系统在工作负载中的性能受到许多因素影响,处理器速度.内存容量.网络或磁盘I/O ...

  2. 转:IIS 应用程序池 内存 自动回收

    原文地址:https://www.cnblogs.com/guohu/p/5209209.html IIS可以设置定时自动回收,默认回收是1740分钟,也就是29小时.IIS自动回收相当于服务器IIS ...

  3. Python基础知识:测试代码

    1.Python标准库中的模块unittest提供了代码测试工具. 单元测试用于核实函数的某个方面没有问题: 测试用例是一组单元测试,这些单元测试一起核实函数在各种情形下的行为都符合要求. 通俗的理解 ...

  4. SQL2008 一直error40 无法连接到localhost

    1. Problem 2. Reason 可能是之前卸载SQL Server时没卸载干净 后来又重新安装时导致默认实例名不能用 就随手写了个SQLMOLORY实例名 但其实系统内这时是有两个SQL实例 ...

  5. 使用 React-Sketchapp 管理你的设计资产

    首发:https://www.yuque.com/jingwhale/blog/do37mc 最近在整理设计规范的过程中,尝试使用了 Airbnb 公司发布的 react-sketchapp 工具.从 ...

  6. (转)Spring boot(一):入门篇

    https://www.cnblogs.com/ityouknow/p/5662753.html#!comments 构建微服务:Spring boot 入门篇 什么是Spring Boot Spri ...

  7. Javascript中的undefined、null、""、0值和false的区别总结

    在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库字段的空值DBN ...

  8. Redis和Memcached的一些区别

    我们都知道,把一些热数据存到缓存中可以极大的提高速度,那么问题来了,是用Redis好还是Memcached好呢,以下是它们两者之间一些简单的区别与比较: 1. Redis不仅支持简单的k/v类型的数据 ...

  9. 20145236《网络对抗》Exp8 WEB基础实践

    20145236<网路对抗>Exp8 WEB基础实践 一.基础问题回答 什么是表单 表单在网页中主要负责数据采集功能 一个表单有三个基本组成部分: 表单标签 表单域:包含了文本框.密码框. ...

  10. 流程控制之for

    for循环是 迭代式循环,其强大之处在于循环取值 用法一: l = [1, 2, 3, 4, 5, 5, 6, 5, 4, 3] for x in l: print(x) info = {'} for ...