搜索+贪心。

参考博客:http://blog.sina.com.cn/s/blog_8442ec3b0100xib1.html

主要是要看出来,如果有解的话,每个沿湖城市能够流到的范围是连续的区间...然后1遍dfs判断有无解,2遍确定区间,最后排序贪心。

直觉上来说,如果流到的区域中间是断的,那么中间的地势一定比两边高,从其他地方也流不到。

(理论上是应该bfs的= =)

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <utility>
using namespace std; #define tr(x) printf(#x),putchar('\n')
typedef pair<int, int> P;
const int MAXN = 600, dir[] = {0, 0, 1, -1}, INF = 0x3f3f3f3f;
int H[MAXN][MAXN], vis[MAXN][MAXN], cnt, M, N;
P r[MAXN]; //第一行每个城市可以流到的范围 void dfs(int x, int y){
vis[x][y] = 1;
if(x == N - 1){
++cnt;
}
for(int i = 0; i < 4; ++i){
int dx = x + dir[i], dy = y + dir[3-i];
if(0 <= dx && dx < N && 0 <= dy && dy < M && !vis[dx][dy] && H[dx][dy] < H[x][y]){
dfs(dx, dy);
}
}
} void dfsL(int s, int x, int y){
vis[x][y] = 1;
if(x == 0){
r[y].first = s;
}
for(int i = 0; i < 4; ++i){
int dx = x + dir[i], dy = y + dir[3-i];
if(0 <= dx && dx < N && 0 <= dy && dy < M && !vis[dx][dy] && H[dx][dy] > H[x][y]){
dfsL(s, dx, dy);
}
}
} void dfsR(int s, int x, int y){
vis[x][y] = 1;
if(x == 0){
r[y].second = s;
}
for(int i = 0; i < 4; ++i){
int dx = x + dir[i], dy = y + dir[3-i];
if(0 <= dx && dx < N && 0 <= dy && dy < M && !vis[dx][dy] && H[dx][dy] > H[x][y]){
dfsR(s, dx, dy);
}
}
} int main(){
freopen("in.txt", "r", stdin);
scanf("%d%d", &N, &M);
for(int i = 0; i < N; ++i){
for(int j = 0; j < M; ++j){
scanf("%d", &H[i][j]);
}
} for(int i = 0; i < M; ++i){
if(!vis[0][i]) dfs(0, i);
}
if(cnt < M){
printf("0\n%d\n", M - cnt);
return 0;
} //======================================
for(int i = 0; i < M; ++i){
r[i].first = INF;
}
memset(vis, 0, sizeof(vis));
for(int i = 0; i < M; ++i){
if(!vis[N - 1][i]){
dfsL(i, N-1, i);
}
}
memset(vis, 0, sizeof(vis));
for(int i = M-1; i >= 0; --i){
if(!vis[N - 1][i]){
dfsR(i, N-1, i);
}
} sort(r, r + M); int ans = 0, nowr = -1, maxr, i = 0;
while(i < M && nowr < M - 1){
maxr = -1;
while(i < M && r[i].first <= nowr + 1){
maxr = max(maxr, r[i].second);
++i;
}
nowr = maxr;
++ans;
} printf("1\n%d\n", ans); return 0;
}

[NOIP 2010] 引水入城的更多相关文章

  1. noip 2010 引水入城 贪心 + 搜索

    不难分析出如果有解则每个蓄水厂所能覆盖到的干旱城市一定是连续的.否则,中间那些没被覆盖的部分永远都不能被覆盖到. 当然,每个蓄水厂所覆盖的城市有可能不连续,不过既然有解,则一定都是连续的.我们可以开一 ...

  2. [NOIP 2010]饮水入城 搜索+贪心

    考试的时候写了个dfs找出来了,最后处理的时候想到了贪心,但是正确性没有想通.然后想了想动规,也没想通.最后没办法,用状态的话用了个状压,弄了40分. 正解是bfs+贪心.Dfs也有过的. 下面题解引 ...

  3. [NOIP 2010] 引入入城

    [题目链接] https://loj.ac/problem/2595 [算法] 显然 , 每个第一行的成市控制的一定是一段区间 那么 , 问题就转化为了经典的区间覆盖问题 , 贪心即可 , 时间复杂度 ...

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

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

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

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

  6. CODEVS 1066/洛谷 P1514引水入城

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

  7. 洛谷P1514 引水入城

    洛谷P1514 引水入城 原题链接 一道好题...细节真多 第一次提交90分,然后就GG了,不知从何改起 其实比较简单吧... 首先,一个点的水流向最后一排,一定可以形成一个区间. 不行的话肯定GG ...

  8. NOIP2010 引水入城

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

  9. Luogu 1514 引水入城 (搜索,动态规划)

    Luogu 1514 引水入城 (搜索,动态规划) Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图 ...

随机推荐

  1. python第三天(list,元组,dictionary)

    1.list 列表 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可.如下 ...

  2. 为 Ubuntu/Anaconda/pip 添加国内下载源

    背景 正在看 tensorflow-lite 压缩模型的部分,结果 tutorial 一上来就要卸旧版安装 tf-nightly (新版?反正小白下就vans了) 然而好不容易才编译好源码舍不得删.又 ...

  3. BZOJ 3531 SDOI2014 旅行 树链剖分+线段树动态开点

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3531 题意概述: 给出一棵N个点的树,树上的每个结点有一个颜色和权值,支持以下四种操作: ...

  4. linux学习(二)——汤哥的推荐书籍

    成为一名精通 Linux程序设计的高级程序员一直是不少朋友孜孜以求的目标. 根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows程序员的 1.8 倍.Java 程序员的 2. ...

  5. MapReduce 并行编程理论基础

    对于mapreduce这一并行计算模型,一直以来都不是很清楚其具体的执行细节,今天看了学院一位老师的实验指导书,对这一过程有了一个初步的理解,特别是map阶段和reduce阶段,所以做了一份笔记,现在 ...

  6. Linux杂技

    挂载光盘 mkdir /mnt/cdrom #建立挂载点 mount /dev/cdrom /mnt/cdrom/ #挂载光盘 更换YUM源: cd /etc/yum.repos.d/ 使网络yum源 ...

  7. 【转】深入理解Java中的String

    原文链接:http://www.cnblogs.com/xiaoxi/p/6036701.html 一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码 ...

  8. spring中context:property-placeholder

    发现网上对于这个标签的解释过于复杂,这里从实用性角度简短的进行说明. 首先,它是spring3中提供的标签. 只需要在spring的配置文件里添加一句: <context:property-pl ...

  9. hdu 1598 find the most comfortable road (并查集)

    find the most comfortable road Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  10. SRM708 div1 PalindromicSubseq(动态规划+容斥原理)

    题目大意:给定一个字符串,记X[i]为包含s[i]这个字符的所有子列是回文串的个数(注意是子列而不是子串),求出所有的X[i]*(i+1),然后异或起来作为返回结果 题解: 首先用容斥来想,如果当前枚 ...