题目:洛谷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. Swift学习笔记(9):枚举

    目录: 基本语法 关联值 原始值 枚举为一组相关的值定义了一个共同的类型. ・可以给枚举成员指定原始值类型:字符串,字符,整型值或浮点数等 ・枚举成员可以指定任意类型的关联值存储到枚举成员中 ・枚举可 ...

  2. 常用css框架 Sass/Less

    Bootstrap less/sass Sass (Syntactically Awesome Stylesheets)是一种动态样式语言,Sass语法属于缩排语法,比css比多出好些功能(如变量.嵌 ...

  3. .NET深入解析LINQ框架1

    1.LINQ简述 2.LINQ优雅前奏的音符 2.1.隐式类型 (由编辑器自动根据表达式推断出对象的最终类型) 2.2.对象初始化器 (简化了对象的创建及初始化的过程) 2.3.Lambda表达式 ( ...

  4. 【原创】Google的文本内容对比代码

    /* * Diff Match and Patch * * Copyright 2006 Google Inc. * http://code.google.com/p/google-diff-matc ...

  5. N!,斯特林近似

    题目链接 输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 1000) 第2 -  ...

  6. FCC编程题之中级算法篇(下)

    介绍 本篇是"FCC编程题之中级算法篇"系列的最后一篇 这期完结后,下期开始写高级算法,每篇一题 目录 1. Smallest Common Multiple 2. Finders ...

  7. eclipse界面更改为黑色

    效果如下: 更改很简单,该两个配置就行了,如下图: 1.在window中打开Preferences,然后跟下图一样配置就行了.

  8. LaTex的几种数学符号字体以及相关说明

    \mathrm is the normal upright Roman font \mathnormal is the normal math italic font: $\mathnormal{a} ...

  9. js的onclick和jq的click以及on和bind的区别

    onclick和click,只能静态绑定点击事件:bind的可以一次绑定多个事件(click/onmouseover等):on可以动态的绑定事件,当页面加载完成调用on即可

  10. ActiveMQ服务安装

    1.下载安装ActiveMQ服务提供者 http://activemq.apache.org/ 2.启用ActiveMQ服务 cd [activemq_install_dir] bin\activem ...