题目描述

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

为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中。

因此,只有与湖泊毗邻的第11 行的城市可以建造蓄水厂。而输水站的功能则是通过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。由于第NN 行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干旱区中不可能建有水利设施的城市数目。

输入输出格式

输入格式:

每行两个数,之间用一个空格隔开。输入的第一行是两个正整数N,MN,M,表示矩形的规模。接下来NN 行,每行MM个正整数,依次代表每座城市的海拔高度。

输出格式:

两行。如果能满足要求,输出的第一行是整数11,第二行是一个整数,代表最少建造几个蓄水厂;如果不能满足要求,输出的第一行是整数00,第二行是一个整数,代表有几座干旱区中的城市不可能建有水利设施。

输入输出样例

输入样例#1: 复制

2 5
9 1 5 4 3
8 7 6 1 2
输出样例#1: 复制

1
1
输入样例#2: 复制

3 6
8 4 5 6 4 4
7 3 4 3 3 3
3 2 2 1 1 2
输出样例#2: 复制

1
3 非常好的一道搜索题目
贪心+DFS即可解决 这题DFS很简单 主要是后期处理
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 5005
int n,m;
int mp[N][N];
int vis[N][N];
int vis2[N];
int ri[N];
vector<int>node[N];//该城市所到达的点
vector<int>in[N];//到达该点的城市
bool inmap(int x,int y)
{
return x>=&&x<=n&&y>=&&y<=m;
}
int dx[]={,,,-};
int dy[]={,-,,};
void dfs(int x,int y,int flag)
{
if(x==n)
{
node[flag].push_back(y);
ri[flag]=max(ri[flag],y);
in[y].push_back(flag);
vis2[y]=;
}
rep(i,,)
{
int a=x+dx[i];
int b=y+dy[i];
if(!inmap(a,b))continue;
if(vis[a][b]==flag)continue;
if(mp[a][b]>=mp[x][y])continue;
vis[a][b]=flag;
dfs(a,b,flag);
}
}
struct aaa
{
int id,h;
}s[N];
bool cmp(aaa a,aaa b)
{
return a.h>b.h;
}
int main()
{
RII(n,m);
rep(i,,n)
rep(j,,m)
{
RI(mp[i][j]);
if(i==)
s[j].id=j,s[j].h=mp[i][j];
}
sort(s+,s++m,cmp);//贪心优化 高的先来 剪了30ms。。。 rep(i,,m)
if(!vis[][ s[i].id ])
dfs(,s[i].id,s[i].id); int ok=;
int cnt=;
rep(i,,m)
if(!vis2[i])ok=,cnt++;
if(!ok)printf("%d\n%d",,cnt);
else
{
printf("1\n"); int sum=;
int i=;
while(i<=m)
{
int maxx=;
rep(j,,in[i].size()-)
maxx=max(maxx, ri[ in[i][j] ] ); sum++;
i=maxx+;
}
cout<<sum;
}
return ;
}
大佬的做法   速度比我的快一倍QAQ

递归求左界和右界非常巧妙
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#include <stack>
using namespace std;
#define maxn 510
#define nx x+xx[i]
#define ny y+yy[i]
int l[maxn][maxn],r[maxn][maxn];
int high[maxn][maxn];
int n,m;
bool vis[maxn][maxn];
int xx[]={-,,,};
int yy[]={,,,-};
int qx[maxn*maxn],qy[maxn*maxn]; inline void dfs(int x,int y)
{
vis[x][y]=true;
for (int i=;i<;i++){
if (nx< || nx>n || ny< || ny>m) continue;
if (high[nx][ny]>=high[x][y]) continue;
if (!vis[nx][ny])dfs(nx,ny);
l[x][y]=min(l[x][y],l[nx][ny]);
r[x][y]=max(r[x][y],r[nx][ny]);
}
} inline int read()
{
int ret=;
char c=getchar();
while (c<'' || c>'') c=getchar();
while (c>='' && c<=''){
ret=ret*+c-'';
c=getchar();
}
return ret;
} int main()
{
n=read();
m=read();
memset(vis,false,sizeof(vis));
memset(l,0x3f,sizeof(l));
memset(r,,sizeof(r));
for (int i=;i<=m;i++)
l[n][i]=r[n][i]=i;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
high[i][j]=read();
for (int i=;i<=m;i++)
if (!vis[][i]) dfs(,i);
bool flag=false;
int cnt=;
for (int i=;i<=m;i++)
if (!vis[n][i]){
flag=true;
cnt++;
}
if (flag){
puts("");
printf("%d",cnt);
return ;
}
int left=;
while (left<=m){
int maxr=;
for (int i=;i<=m;i++)
if (l[][i]<=left)
maxr=max(maxr,r[][i]);
cnt++;
left=maxr+;
}
puts("");
printf("%d",cnt);
}

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

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

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

  2. 洛谷P1514 引水入城

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

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

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

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

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

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

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

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

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

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

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

  8. P1514 引水入城

    概述 首先,这是一道好题,这道题既考查了图论的dfs知识,又考察了区间贪心问题中很典型的区间覆盖问题,着实是一道好题. 大概思路说明 我们观察到,只有第一行可以放水库,而第一行在哪里放水库的结果就是直 ...

  9. Luogu P1514 引水入城

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

随机推荐

  1. 前端 -----jQuery的选择器

    02-jQuery的选择器   我们以前在CSS中学习的选择器有: 今天来学习一下jQuery 选择器. jQuery选择器是jQuery强大的体现,它提供了一组方法,让我们更加方便的获取到页面中的元 ...

  2. Android UiAutomator - CTS Frame

    使用UiAutomator进行UI自动化测试后,生成的测试结果并不是很美观.为了生成一份好看的测试结果(报告),本文将使用CTS框架,当然也可以自己编写一份测试报告框架(如:生成html,excel报 ...

  3. MySQL数据库之安装

    一.基础部分 1.数据库是什么 之前所学,数据要永久保存,比如用户注册的用户信息,都是保存于文件中,而文件只能存在于某一台机器上. 如果我们不考虑从文件中读取数据的效率问题,并且假设我们的程序所有的组 ...

  4. poj2728 生成树01分数规划 (二分答案)

    给定整数序列a,b,求出下式的最大值 sum{ai*xi}/sum{bi*xi},xi=0|1 通俗来说,就是选出一些整数对(ai,bi),使得选出的a之和与选出的b之和商最大化 二分答案L,即选出的 ...

  5. java函数式编程之Supplier

    原创 2016年12月25日 10:02:52 标签: 函数式编程 / java 3250 描述:Supplier< T>接口没有入参,返回一个T类型的对象,类似工厂方法. 源码: pub ...

  6. javascript 自动填充功能

    javascript 自动填充功能 javascript: (function(){ $("#zipcode").val("zip");$("#pho ...

  7. 关于js渲染网页时爬取数据的思路和全过程(附源码)

    于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...

  8. 关于前端滚动条,input框等样式的修改

    1.改变滚动条的样式 .orderList::-webkit-scrollbar {/*滚动条整体样式*/ width: 4px; /*高宽分别对应横竖滚动条的尺寸*/ height: 4px;}.o ...

  9. MySQL 复制表到另一个表

    1.复制表结构及数据到新表 create table 新表 select * from 旧表 2.只复制表结构到新表 方法1:(低版本的mysql不支持,mysql4.0.25 不支持,mysql5已 ...

  10. 20165323 学习基础和C语言基础调查

    20165323 学习基础和C语言基础调查 一.技能学习心得 1.你有什么技能比大多人更好? 我觉得我羽毛球打的还行,不能说打得比大多数人好,但是对于一些打羽毛球的要领还是掌握的. 2.针对这个技能的 ...