题目:洛谷P1514、Vijos P1777、codevs1066。

题目大意:有一个$n×m$的矩阵,每个点都有一个高度,可以在第一行的任意点建立蓄水厂。现在要把水输到最后一行的所有点上,规定水只能流到高度比当前点小的点上。先让你判断能否输到所有点上,如能,输出最少建多少个蓄水厂;如不能,输出最多能输到几个点上。

解题思路:首先把第一行所有点塞进队列里,跑BFS,找出所有能到的点,然后判断能否输到最后一行所有点上。如果不能,输出最后一行能被输到的点的总数。如果能的话,我们依次把第一行每个点能输到的点求出来。

下面证明在能输到最后一行所有点的情况下,第一行每个点能输到最后一行的点一定构成一个连续的区间。

如果出现一个蓄水厂分流到两个不同的区间,那么有下图:

可以发现,红色区域由于已经被蓝色区域包围,所以无论如何都是无法流到的,说明如果有可行的方案,流到的一定是一个连续的区间。

然后就是区间覆盖问题,贪心一下就好了。

C++ Code:

#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,h[505][505],ans;
bool b[505][505];
queue<pair<int,int> >q;
const int dx[]={0,0,1,-1};
const int dy[]={-1,1,0,0};
struct QJ{
int L,R;
bool operator<(const QJ& rhs)const{
if(L!=rhs.L)return L<rhs.L;
return R>rhs.R;
}
}a[505];
void bfs(){
memset(b,1,sizeof b);
for(int i=1;i<=m;++i){
b[1][i]=false;
q.push(make_pair(1,i));
}
while(!q.empty()){
int x=q.front().first,y=q.front().second;
q.pop();
for(int i=0;i<4;++i){
int lx=x+dx[i],ly=y+dy[i];
if(ly>0&&ly<=m&&lx<=n&&b[lx][ly]&&h[x][y]>h[lx][ly]){
b[lx][ly]=false;
q.push(make_pair(lx,ly));
}
}
}
}
void bfs2(int t){
memset(b,1,sizeof b);
b[1][t]=false;
q.push(make_pair(1,t));
int Lft=20000,Rgt=0;
while(!q.empty()){
int x=q.front().first,y=q.front().second;
q.pop();
if(x==n){
if(y<Lft)Lft=y;
if(y>Rgt)Rgt=y;
}
for(int i=0;i<4;++i){
int lx=x+dx[i],ly=y+dy[i];
if(ly>0&&ly<=m&&lx<=n&&b[lx][ly]&&h[x][y]>h[lx][ly]){
b[lx][ly]=false;
q.push(make_pair(lx,ly));
}
}
}
a[t].L=Lft;
a[t].R=Rgt;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)scanf("%d",&h[i][j]);
bfs();
ans=0;
for(int i=1;i<=m;++i)
if(b[n][i])++ans;
if(ans){
printf("0\n%d\n",ans);
return 0;
}
for(int i=1;i<=m;++i)
bfs2(i);
sort(a+1,a+m+1);
int l=a[1].L,r=a[1].R;
ans=1;
while(r<m){
int p,mx=0;
for(int i=1;i<=m;++i){
if(a[i].L<=l)continue;
if(a[i].L>r+1)break;
if(mx<a[i].R)mx=a[i].R,p=i;
}
l=a[p].L,r=a[p].R;++ans;
}
printf("1\n%d\n",ans);
return 0;
}

[NOIP2010提高组]引水入城的更多相关文章

  1. [NOIp2010] luogu P1514 引水入城

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

  2. 洛谷P1514 [NOIP2010提高组T4]引水入城

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

  3. Codevs 1066 引水入城 2010年NOIP全国联赛提高组

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

  4. 引水入城 2010年NOIP全国联赛提高组(bfs+贪心)

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

  5. 521. [NOIP2010] 引水入城 cogs

    521. [NOIP2010] 引水入城 ★★★   输入文件:flow.in   输出文件:flow.out   简单对比时间限制:1 s   内存限制:128 MB 在一个遥远的国度,一侧是风景秀 ...

  6. NOIP2010 引水入城

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

  7. luoguP1514 引水入城 题解(NOIP2010)(Bfs+贪心)

    P1514 引水入城  题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...

  8. noip2010提高组题解

    NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...

  9. vijos p1777 引水入城(bfs+贪心)

    引水入城   描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了使 ...

随机推荐

  1. 移动端video播放时不弹出页面层

    移动端视频在播放时会主动弹出页面,有的浏览器不会.对那些会的浏览器进行处理: 直接加上下面三个属性即可,兼容方面就不说了,微信上是很ok的. <video x5-playsinline=&quo ...

  2. C# Lambda && Linq

    Lambda表达式在C#3.0加入,它是一个匿名函数,可用于创建委托或者表达式树类型,运算符为=>,读作"goes to",=>左侧是变量,右侧是表达式,变量类型可以自 ...

  3. 亿财道APP赚钱攻略,亿财道,一个看广告年入36万的APP

            亿财道(http://etway.net/),一款看广告(传单)赚钱的软件,这是一项革新的广告产品,代替了以往的纸质传单.在商家节约成本的同时,还给阅读者佣金,推广也有相应提成比例. ...

  4. Shiro授权认证原理和流程

    先来张图: 这是一张shiro的功能图: Authentication: 身份认证/登录,验证用户是否拥有相应的身份 Authorization: 授权/权限验证,验证某个已认证的用户是否拥有某个权限 ...

  5. VUE项目axios请求头更改Content-Type

    const httpServer = (opts, data) => { const token = localStorage.getItem('token') const PUBLIC = ` ...

  6. vb常用的内部函数(二):字符串函数

    len(string):计算字符串长度函数.返回字符串string中字符的个数.一个汉字为一个字符,空格也为一个字符,空字符串的长度为0. Ltrim(string).Rtrim(string).Tr ...

  7. selenium自动化(二).........................................Demo篇

    二 编写简单代码 简单代码一:   demo1.py 1.from selenium import webdriver driver = webdriver.Chrome() driver.get(& ...

  8. js递归获取html页面所有标签

    js原生递归获取,直接源码 : <script> var child = document.children; var arr = [];//用来存放获取到的所有的标签 function ...

  9. [洛谷P3948]数据结构

    题目大意:有n个数,opt个操作,并给你md.min.max. 每种操作有以下两种:1.给一段区间加一个固定值.2.询问一段区间内满足$min\leq T*i\ mod\ md\leq max$(T是 ...

  10. U盘安装CentOS 7系统

    首先,本文适合新的不能再新的新手 小白出身的轩轩,由于最近正在学习Linux的centos系统,所以突发奇想,为什么不把轩轩的本机也安装一个centos系统呢,让两个系统互不干扰,想到就做到,遂开始动 ...