题目描述:
在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划十分特殊,刚好构成一个 行 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度。
为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中。因此,只有与湖泊毗邻的第 行的城市可以建造蓄水厂。而输水站的功能则是通过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。
由于第 行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利设施。那么,这个要求能否满足呢?如果能,请计算少建造几个蓄水厂;如果不能,求干旱区中不可能建有水利设施的城市数目。
输入格式:
输入的每行中两个数之间用一个空格隔开。
输入的第一行是两个正整数N和M,表示矩形的规模;
接下来N行,每行M个正整数,依次代表每座城市的海拔高度。
输出格式:
输出有两行。
如果能满足要求,输出的第一行是整数1,第二行是一个整数,代表最少建造几个蓄水厂;
如果不能满足要求,输出的第一行是整数0,第二行是一个整数,代表有几座干旱区中的城市不可能建有水利设施。
样例:
样例输入: 样例输出 :
2 5 1
9 1 5 4 3 1
8 7 6 1 2
思路:
我们首先假设存在一种情况如下:
那么蓝色覆盖情况如下:
那么如果红色要到如图的地方,则必然穿过蓝色,则红色必然要跟着蓝色到达下面的3个蓝色方块,如下图:
如此,我们可以知道,一座水库能覆盖的最后一行必然是一个连续的区间。如果不是这样的话,那么没被覆盖的一定是永远不能被任何一座水库覆盖掉的。
根据上图的分析,我们只要搜索一下第一行的每个格子能到达的区间,做区间最少线段覆盖即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m, cnt, a[1005][1005], l[1005][1005], r[1005][1005];
bool v[1005][1005];
struct node {
int left, right;
} ans[1005];
int ex[4]