题目描述

在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划十分特殊,刚好构成一个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);
}

最新文章

  1. JavaScript的==和===运算符
  2. Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)
  3. 实时监控log文件
  4. Gradle basic
  5. Cocos2d-x 程序是如何开始运行与结束的
  6. 京东2017 C++一面
  7. java在线截图---通过指定的URL对网站截图
  8. Unity3d BTDF实时折射模拟有粗糙度的半透明物体
  9. ElasticSearch Aggregation
  10. php.ini配置文件中的session配置
  11. Nginx配置优化及深入讲解,大家可以听一下
  12. 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能
  13. 服务器端 less的安装
  14. CF.802C.Heidi and Library (hard) (费用流zkw)
  15. c++ 模板相关
  16. Learning-Python【8】:Python字符编码
  17. struts2客户端与服务器端即jsp页面与action之间的关系
  18. km板子(二分图最大权匹配)
  19. PKUWC 2018 铁牌记
  20. vue组件--TagsInput

热门文章

  1. AES加解密程序的实现
  2. iOS 高德地图轨迹回放的 思路, 及方法
  3. PID控制器开发笔记之八:带死区的PID控制器的实现
  4. Confluence 6 为翻译显示用户界面的键(Key)名称
  5. 巧用&amp;&amp;和|| 让逻辑代码更简洁,逼格看起来更高一点(玩笑脸)
  6. springboot+mybatis+springMVC基础框架搭建
  7. ajax请求成功 但是被error拦截
  8. install memcached for ubuntu
  9. python网络爬虫day1
  10. Centos+Redis 集群