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

为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中。
因此,只有与湖泊毗邻的第 11 行的城市可以建造蓄水厂。而输水站的功能则是通过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。由于第 NN 行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干旱区中不可能建有水利设施的城市数目。
输入输出格式
输入格式:
每行两个数,之间用一个空格隔开。输入的第一行是两个正整数 N,MN,M ,表示矩形的规模。接下来 NN 行,每行 MM 个正整数,依次代表每座城市的海拔高度。
输出格式:
两行。如果能满足要求,输出的第一行是整数 11 ,第二行是一个整数,代表最少建造几个蓄水厂;如果不能满足要求,输出的第一行是整数 00 ,第二行是一个整数,代表有几座干旱区中的城市不可能建有水利设施。
数据范围:

这个题其实是 记忆化搜索+贪心
首先考虑第一行某一个点的贡献,玩一玩我们会发现
如果它对最后一行的贡献不是一段区间,那么就凉了,它覆盖的区间的中间值谁也进不去。
先考虑求出贡献,对每个点进行一次\(dfs\),通过记忆化不搜索重复的点,即得出了好多个区间
然后判断一下是否有没覆盖的
我们发现,用区间覆盖一个线段是可以贪心的。
以左端点为关键字进行排序。
从左到右对线段进行覆盖。
策略是每次在已经覆盖到的线段中选择一个左端点,要求右端点最远
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=505;
const int X[5]={0,-1,0,1,0};
const int Y[5]={0,0,1,0,-1};
pair <int,int > dx[N];
int vis[N],color[N],used[N][N];//第一排的某些是否访问,最后一排
int ml,mr,n,m,h[N][N],k;
void dfs(int x,int y)
{
if(used[x][y]) return;
used[x][y]=1;
if(x==1)
vis[y]=1;
if(x==n)
{
color[y]=1;
mr=max(mr,y);
ml=min(ml,y);
}
for(int i=1;i<=4;i++)
{
int tx=x+X[i],ty=y+Y[i];
if(h[tx][ty]<h[x][y])
dfs(tx,ty);
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(h,0x3f,sizeof(h));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&h[i][j]);
for(int i=1;i<=m;i++)
if(!vis[i])
{
memset(used,0,sizeof(used));
ml=m+1,mr=0;
dfs(1,i);
if(ml!=m+1) dx[++k]=make_pair(ml,mr);
}
int cnt=0;
for(int i=1;i<=m;i++)
if(!color[i])
cnt++;
if(cnt)
{
printf("0\n%d\n",cnt);
return 0;
}
sort(dx+1,dx+1+k);
int r=1,i=1,ans=0;
while(r<=m)
{
int mx=0;
while(dx[i].first<=r)
mx=max(mx,dx[i++].second);
r=mx+1;
ans++;
}
printf("1\n%d\n",ans);
return 0;
}
2018.7.25
洛谷 P1514 引水入城 解题报告的更多相关文章
- 洛谷P1514 引水入城
洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...
- CODEVS 1066/洛谷 P1514引水入城
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远的国 ...
- 洛谷P1514 引水入城 [搜索,区间DP]
题目传送门 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 N 行×M 列的矩形,如上图所示,其中每个格子都代表一座城市,每 ...
- 洛谷P1514 引水入城——dfs
题目:https://www.luogu.org/problemnew/show/P1514 搜索+DP: 自己想出来的方法第一次80分好高兴! 再改了改就A了,狂喜乱舞: 也就是 dfs,仔细一想第 ...
- [NOIP2010] 提高组 洛谷P1514 引水入城
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- 洛谷 P1514 引水入城
这次不说闲话了,直接怼题 这道题用bfs其实并不难想,但比较困难的是怎么解决满足要求时输出蓄水厂的数量.其实就像其他题解说的那样,我们可以用bfs将它转化成一个区间覆盖问题,然后再进行贪心. 首先枚举 ...
- 洛谷P1514引水入城
题目 搜索加贪心其实并不需要用到\(DP\),搜索也是比较简单地搜索. 对于每个第一行的城市进行类似于滑雪那道题的搜索,然后记录最后一行它所覆盖的区间,易得一个一行城市只会有一个区间.然后可以在最后进 ...
- [luogu]P1514 引水入城[搜索][记忆化][DP]
[luogu]P1514 引水入城 引水入城 题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形 ,如下图所示,其中每个格 ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
随机推荐
- rem自适应布局
rem自适应原理 rem是根据html的font-size大小来变化,正是基于这个出发,我们可以在每一个设备下根据设备的宽度设置对应的html字号,从而实现了自适应布局.更多介绍请看这篇文章:rem是 ...
- kallsyms , addr to symbol
#!/usr/bin/env python # addr2sym.py - resolve addresses to symbols, using a map file # Reads a log f ...
- ubuntu18.04安装mongoDB 4.0
STEP 1: 在终端输入GPK码 $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334B ...
- 令自己的本地ip可以被外网访问
https://www.ngrok.cc/_book/general/open.html
- PHPCMS如何让手机站点取消浏览大图直接加载原图
一.然后找到phpcms\modules\wap\functions\global.func.php 文件,找到相关代码,如下图: return '<img src="'.thumb( ...
- Deeplearning - Overview of Convolution Neural Network
Finally pass all the Deeplearning.ai courses in March! I highly recommend it! If you already know th ...
- 第六次ScrumMeeting博客
第六次ScrumMeeting博客 本次会议于10月31日(二)22时整在3公寓725房间召开,持续15分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕.方科栋. 除了汇报任务外,窦鑫泽同学还就前 ...
- ES6的新特性(11)——Class 的继承
Class 的继承 简介 Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多. class Point { } class ColorPoint ...
- “我爱淘”第二冲刺阶段Scrum站立会议5
完成任务: 完成了登录界面的实现,可以按照数据库中的用户名密码进行登录,. 计划任务: 在客户端实现分类功能,通过学院的分类查看书籍. 遇到问题: 再登录上了之后,并且保存密码,但是点击退出当前账号这 ...
- lintcode-414-两个整数相除
414-两个整数相除 将两个整数相除,要求不使用乘法.除法和 mod 运算符. 如果溢出,返回 2147483647 . 样例 给定被除数 = 100 ,除数 = 9,返回 11. 标签 二分法 思路 ...