NOIP 2010 - 提高组 引水入城 棋盘上的BFS+区间覆盖(贪心) 重庆一中高2018级竞赛班第十次测试 2016.9.16 Problem 4
2016-09-20 19:16
351 查看
【问题描述】
在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度。
为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中。因此,只有与湖泊毗邻的第1行的城市可以建造蓄水厂。而输水站的功能则是通过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。
由于第N行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干旱区中不可能建有水利设施的城市数目。
【输入格式】
输入文件的每行中两个数之间用一个空格隔开。
输入的第一行是两个正整数N和M,表示矩形的规模。
接下来N行,每行M个正整数,依次代表每座城市的海拔高度。
【输出格式】
输出有两行。如果能满足要求,输出的第一行是整数1,第二行是一个整数,代表最少建造几个蓄水厂;如果不能满足要求,输出的第一行是整数0,第二行是一个整数,代表有几座干旱区中的城市不可能建有水利设施。
【输入样例】
【输出样例】
【数据范围】
思路:先将第一行的城市进行多源BFS,验证最后一行的城市是否都能访问到,若不能,则统计并输出。若能,则到下一步。易证若能到达每个城市,则第一行每一个城市对应的可到达的最后一行城市是连续的。证明详见:Cpp环境【NOIP2010提高组】引水入城。
因此,求出第一行每个城市对应的最左城市和最右城市,然后进行贪心区间覆盖即可。
在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度。
为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中。因此,只有与湖泊毗邻的第1行的城市可以建造蓄水厂。而输水站的功能则是通过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。
由于第N行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干旱区中不可能建有水利设施的城市数目。
【输入格式】
输入文件的每行中两个数之间用一个空格隔开。
输入的第一行是两个正整数N和M,表示矩形的规模。
接下来N行,每行M个正整数,依次代表每座城市的海拔高度。
【输出格式】
输出有两行。如果能满足要求,输出的第一行是整数1,第二行是一个整数,代表最少建造几个蓄水厂;如果不能满足要求,输出的第一行是整数0,第二行是一个整数,代表有几座干旱区中的城市不可能建有水利设施。
【输入样例】
2 5 9 1 5 4 3 8 7 6 1 2
【输出样例】
1 1
【数据范围】
思路:先将第一行的城市进行多源BFS,验证最后一行的城市是否都能访问到,若不能,则统计并输出。若能,则到下一步。易证若能到达每个城市,则第一行每一个城市对应的可到达的最后一行城市是连续的。证明详见:Cpp环境【NOIP2010提高组】引水入城。
因此,求出第一行每个城市对应的最左城市和最右城市,然后进行贪心区间覆盖即可。
#include<cstdio> #include<cstring> #include<queue> using namespace std; int n,m,g[505][505]; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; struct data { int x,y; }; data p[505]; bool inq[505][505]; void BFS() { memset(inq,0,sizeof(inq)); queue<data>q; for(int i=1;i<=m;i++) { q.push((data){1,i}); inq[1][i]=1; } while(!q.empty()) { data t,tt; t=q.front(); q.pop(); for(int i=0;i<4;i++) { tt.x=t.x+dx[i]; tt.y=t.y+dy[i]; if(inq[tt.x][tt.y]) continue; if(tt.x<1 || tt.x>n || tt.y<1 || tt.y>m) continue; if(g[tt.x][tt.y]>=g[t.x][t.y]) continue; q.push((data){tt.x,tt.y}); inq[tt.x][tt.y]=1; } } } void BFS1(data s) { memset(inq,0,sizeof(inq)); queue<data>q; q.push(s); inq[s.x][s.y]=1; while(!q.empty()) { data t,tt; t=q.front(); q.pop(); for(int i=0;i<4;i++) { tt.x=t.x+dx[i]; tt.y=t.y+dy[i]; if(inq[tt.x][tt.y]) continue; if(tt.x<1 || tt.x>n || tt.y<1 || tt.y>m) continue; if(g[tt.x][tt.y]>=g[t.x][t.y]) continue; q.push((data){tt.x,tt.y}); inq[tt.x][tt.y]=1; } } } int main() { //freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&g[i][j]); } } BFS(); int num=0; for(int i=1;i<=m;i++) { if(inq [i]==0) num++; } if(num>0) { printf("0\n%d\n",num); } else { for(int i=1;i<=m;i++) { BFS1((data){1,i}); for(int j=1;j<=m;j++) { if(inq [j]==1 && p[i].x==0) { p[i].x=j; } if(inq [j]==1) { p[i].y=j; } } } int cnt=0,i=1,s=1,t=m; while(i<=m && s<=t) { int last=-1; while(i<=m && p[i].x<=s) { if(p[i].y>last) last=p[i].y; i++; } cnt++; s=last+1; } printf("1\n%d\n",cnt); } return 0; }
相关文章推荐
- NOIP 2010 - 普及组 导弹拦截 贪心 重庆一中高2018级竞赛班第三次测试 2016.7.24 Problem 3
- NOIP 2010 - 提高组 乌龟棋 动态规划 重庆一中高2018级竞赛班第八次测试 2016.8.7 Problem 2
- UVa - 1625 Color Length 颜色的长度 动态规划 重庆一中高2018级竞赛班第十次测试 2016.9.16 Problem 2
- 破译密码 动态规划 重庆一中高2018级竞赛班第十次测试 2016.9.16 Problem 3
- NOIP 2013 - 提高组 火柴排队 归并排序+逆序对 重庆一中高2018级竞赛班第六次测试 2016.7.31 Problem 4
- NOIP 2011 - 提高组 聪明的质检员 二分+前缀和 重庆一中高2018级竞赛班第六次测试 2016.7.31 Problem 2
- CQBZOJ - 2916 学生宿舍 动态规划(DP) 重庆一中高2018级竞赛班第十次测试 2016.9.16 Problem 1
- NOIP 2008 - 普及组 排座椅 贪心 重庆一中高2018级竞赛班第五次测试 2016.7.26 Problem 2
- UVa - 1615 Highway 高速公路 贪心+区间选点 重庆一中高2018级竞赛班第五次测试 2016.7.26 Problem 1
- POJ - 1328 Radar Installation 安装雷达 贪心+区间选点 重庆一中高2018级竞赛班第八次测试 2016.8.7 Problem 3
- POJ - 3069 Saruman's Army 萨鲁曼的大军 贪心 重庆一中高2018级竞赛班第三次测试 2016.7.24 Problem 2
- NOIP 2011 - 普及组 瑞士轮 归并排序 重庆一中高2018级竞赛班第四次测试 2016.7.25 Problem 4
- NOIP 2013 - Day 1 货车运输 重庆一中高2018级竞赛班第二次测试 2016.7.13 Problem 4
- 旅行 贪心 重庆一中高2018级竞赛班第四次测试 2016.7.25 Problem 2
- OpenJudge - 2704 寻找平面上的极大点 贪心+使用map优化 重庆一中高2018级竞赛班第九次测试 2016.9.10 Problem 1
- NOIP 2003 - 普及组 乒乓球 模拟+“高级”水题 重庆一中高2018级竞赛班第八次测试 2016.8.7 Problem 4
- NOIP 2010 T4 浅谈如何“引水入城”,泛洪填充法BFS架构FLOODFILL及一类区间覆盖问题贪心求法
- NOIP 2012 - 普及组 摆花 递推 重庆一中高2018级竞赛班第六次测试 2016.7.31 Problem 3
- CQBZOJ - 2935 病毒分裂 分治算法+快速幂 重庆一中高2018级竞赛班第六次测试 2016.7.31 Problem 1
- POJ - 3622/USACO - Dec07 Gold Gourmet Grazers 挑剔的美食家 重庆一中高2018级竞赛班第五次测试 2016.7.26 Problem 4