【题目大意】

一个N行M列的矩形,如上图所示,其中每个格子都代表一座城 市,每座城市都有一个海拔高度。现在要在某些城市建造水利设施。水利设施有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的 蓄水池中。因此,只有与湖泊毗邻的第1行的城市可以建造蓄水厂。而输水站的功能则是通 过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。 由于第N行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干旱区中不可能建有水利设施的城市数目。

【思路】

从湖泊边的每一个城市跑DFS,得到能抵达沙漠边的哪些城市。在沙漠旁所有城市都可以被访问到的情况下,可以证明由湖泊旁的一个城市到达的沙漠旁城市是连续的。

证明:如果不连续那么一定有另一个点b可以到达本点a不能到达的地方,那么两个点的路径一定会有一个交点,a就一定可以通过这个交点到达所谓不能到达的地方,所以假设不成立。

问题转化为了给出一些线段,求用最少的线段数覆盖一个区间。DP一下就好了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int MAXN=500+50;
 7 struct node
 8 {
 9     int l,r;
10     bool operator < (const node&x) const
11     {
12         return l<x.l;
13     }
14 }arriv[MAXN];
15 int m,n,h[MAXN][MAXN],vis[MAXN][MAXN];
16 int f[MAXN],cover[MAXN];
17 int dx[4]={1,-1,0,0};
18 int dy[4]={0,0,1,-1};
19
20 void init()
21 {
22     scanf("%d%d",&m,&n);
23     for (int i=1;i<=m;i++)
24         for (int j=1;j<=n;j++) scanf("%d",&h[i][j]);
25 }
26
27 void dfs(int x,int y,int fr)
28 {
29     vis[x][y]=fr;
30     if (x==m)
31     {
32         arriv[fr].l=min(arriv[fr].l,y);
33         arriv[fr].r=max(arriv[fr].r,y);
34         cover[y]=1;
35     }
36     for (int i=0;i<4;i++)
37     {
38         int xx=x+dx[i],yy=y+dy[i];
39         if (xx<=0 || xx>m || yy<=0 || yy>n) continue;
40         if (h[xx][yy]<h[x][y] && vis[xx][yy]!=fr) dfs(xx,yy,fr);
41     }
42 }
43
44 void solve()
45 {
46     memset(cover,0,sizeof(cover));
47     memset(vis,0,sizeof(vis));
48     for (int i=1;i<=n;i++)
49     {
50         arriv[i].l=MAXN,arriv[i].r=-1;
51         dfs(1,i,i);
52     }
53
54     int flag=1,rem=0;
55     for (int i=1;i<=n;i++) if (!cover[i]){flag=0;rem++;}
56
57     if (flag)
58     {
59         puts("1");
60         sort(arriv+1,arriv+n+1);
61         for (int i=1;i<=n;i++) f[i]=MAXN;
62         f[0]=0;
63         for (int i=1;i<=n;i++)
64         {
65             int l=arriv[i].l,r=arriv[i].r;
66             for (int j=l-1;j<=r;j++) f[r]=min(f[r],f[j]+1);
67         }
68         printf("%d",f[n]);
69     }
70     else printf("0\n%d",rem);
71 }
72
73 int main()
74 {
75     init();
76     solve();
77     return 0;
78 } 

转载于:https://www.cnblogs.com/iiyiyi/p/6060258.html

【搜索+DP】codevs1066-引水入城相关推荐

  1. codevs 1066 引水入城(DFS+DP)

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

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

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

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

    Codevs 1066 引水入城 题目上没有给出样例二,只给出了样例二的图,真是奇怪(丧心病狂). Input2: 3 6 8 4 5 6 4 4 7 3 4 3 3 3 3 2 2 1 1 2 Ou ...

  4. NOIP 2010 引水入城

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

  5. CCF201703-5 引水入城(100分题解链接)

    试题编号: 201703-5 试题名称: 引水入城 时间限制: 2.0s 内存限制: 512.0MB 问题描述: 问题描述 MF城建立在一片高原上.由于城市唯一的水源是位于河谷地带的湖中,人们在坡地上 ...

  6. luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)

    我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...

  7. noip2010引水入城-搜索+贪心

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

  8. P1514 引水入城

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

  9. 【NOIP2010】引水入城

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

  10. 引水入城(dfs的做法)洛谷p1514

    在这道题中, 由于每个点所能到达的地方是一定的,并且若底层能够填满,那么到达底层的位置一定 所以我们可以把每个点所到达的最底层记录下来,若访问到某一之前到达过的点,直接用这个点所到达的底层的点更新即可 ...

最新文章

  1. Nagios+mutt+msmtp 无法发送邮件的问题!
  2. python制作音乐模块_用Python打造一个只属于你的专属音乐播放器,享受动手的快乐!...
  3. 0.11内核rd_load@ramdisk.c中memcpy函数好像有bug
  4. 009_JSONFunction对象
  5. python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点
  6. PHP二开美化版站长技术导航网站源码
  7. Python为视频设置遮罩实现异形窗口播放
  8. Linux文件系统Ext2,Ext3,Ext4性能大比拼
  9. vue插件开发练习--实用弹窗
  10. AI快捷键大全 2020
  11. Hinton、LeCun、Bengio等人获得2022 年阿斯图里亚斯公主技术和科学研究奖!
  12. QNAP 警告: NAS 设备正遭受暴力攻击
  13. 简易网页(HTML)
  14. 网络地址转换——NAT
  15. Python | Python保存高维数组array,Python用pandas将numpy保存csv文件,Python保存3维数组
  16. 程序或算法的时间复杂度
  17. Navicat Premium 12 for Mac 破解
  18. 智能电视是否是一台计算机,误区四 智能电视代替电脑使用_平板电视_液晶电视评测-中关村在线...
  19. date类、calendar类与dateformat类
  20. 进入网页页面的开发者模式——三种方式

热门文章

  1. java微信公众号中文乱码,java微信公众平台获取用户信息中文乱码解决办法(第十五课)...
  2. linux clk模型
  3. NEERC 2014, Eastern subregional contest(汇总)
  4. SAP.PA认证培训视频教程(58集)
  5. java合法标识符_JAVA合法标识符
  6. 赏红叶,是金秋心旷神怡之事
  7. 使用vue.js + jQuery开发组件
  8. 如何快速有效的学习 Python ?阿里高级开发工程师给出建议
  9. facebook surround360 环境配置,编译,测试(生成双目立体全景图)
  10. 如何打造运营商级的超高清强互动直播业务?