noip 2010 引水入城 贪心 + 搜索
不难分析出如果有解则每个蓄水厂所能覆盖到的干旱城市一定是连续的。否则,中间那些没被覆盖的部分永远都不能被覆盖到。
当然,每个蓄水厂所覆盖的城市有可能不连续,不过既然有解,则一定都是连续的。我们可以开一个mark数组来记录每个城市是否被覆盖过,如果有没被覆盖到的,就统计没被覆盖到的数量,并输出无解。否则,就将问题转换成一个最小线段覆盖问题,排序一下再贪心即可。
细节提示:一定要开记忆化搜索,不然会无限TLE(这TM不是P话)
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 500 + 5;
int n, m, mark[maxn], cnt;
int st[maxn], ed[maxn], h[maxn][maxn], A[maxn];
int vis[maxn][maxn];
void dfs(int x,int y)
{
if(vis[y][x]) return ;
vis[y][x] = 1;
if(y == n)
{
int cur = x;
mark[cur] = 1;
while(cur > 1 && h[y][cur-1] < h[y][cur]) mark[cur-1] = 1, cur -= 1;
st[cnt] = min(st[cnt],cur);
cur = x;
while(cur < m && h[y][cur+1] < h[y][cur]) mark[cur+1] = 1, cur += 1;
ed[cnt] = max(ed[cnt],cur);
}
if(y - 1 >= 1 && h[y-1][x] < h[y][x]) dfs(x,y-1);
if(y + 1 <= n && h[y+1][x] < h[y][x]) dfs(x,y+1);
if(x - 1 >= 1 && h[y][x-1] < h[y][x]) dfs(x-1,y);
if(x + 1 <= m && h[y][x+1] < h[y][x]) dfs(x+1,y);
}
bool cmp(int i,int j)
{
if(st[i] == st[j]) return ed[i] < ed[j];
return st[i] < st[j];
}
int main()
{
// freopen("input.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)scanf("%d",&h[i][j]);
for(int i = 1;i <= m;++i)
{
memset(vis,0,sizeof(vis));
A[i] = cnt = i;
st[cnt] = 1000, ed[cnt] = -1000;
dfs(i,1);
}
int unwatered = 0;
for(int i = 1;i <= m;++i)if(!mark[i]) ++ unwatered;
if(unwatered > 0)
{
printf("0\n");
printf("%d",unwatered);
return 0;
}
sort(A+1,A+1+m,cmp);
int pre = 1, ans = 0, i = 0;
while(pre < m)
{
while((st[A[i+1]] <= pre || st[A[i+1]] - pre == 1 )&& i < m)++i;
++ans;
pre = ed[A[i]];
}
printf("1\n");
printf("%d",ans);
return 0;
}
noip 2010 引水入城 贪心 + 搜索的更多相关文章
- [NOIP 2010] 引水入城
搜索+贪心. 参考博客:http://blog.sina.com.cn/s/blog_8442ec3b0100xib1.html 主要是要看出来,如果有解的话,每个沿湖城市能够流到的范围是连续的区间. ...
- Luogu 1514 引水入城 (搜索,动态规划)
Luogu 1514 引水入城 (搜索,动态规划) Description 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,如上图 ...
- [NOIP 2010]饮水入城 搜索+贪心
考试的时候写了个dfs找出来了,最后处理的时候想到了贪心,但是正确性没有想通.然后想了想动规,也没想通.最后没办法,用状态的话用了个状压,弄了40分. 正解是bfs+贪心.Dfs也有过的. 下面题解引 ...
- [NOIP2010] 引水入城 贪心 + 记忆化搜索
---题面--- 题解: 本蒟蒻并没有想到bfs的做法,,,, 只会dfs了 首先我们需要知道一个性质. 我们设k[i].l 为在i点建立水库可以支援到的最左边的城市,k[i].r为最右边的. 那么点 ...
- NOIP2010 引水入城 贪心+DFS
我们先把简单的不能搞死,具题意可证:每个蓄水长的管辖区域一定是连续的.证明:既然我们已经能了那么我们就可以说如果这个区间不是连续的那我们取出这个区间中间阻隔开的那一段,那么对于这一整个区间来说水源不可 ...
- Luogu P1514引水入城【搜索】 By cellur925
题目传送门 这道题开始看好像并没有什么思路,和搜索好像也并没有什么关系.但是我们手玩下样例就会发现,思路其实就三句话:(写这道题的时候在代码里写的) //我们想知道从第1行的每列往下到干旱区的范围 / ...
- [NOIP 2010] 引入入城
[题目链接] https://loj.ac/problem/2595 [算法] 显然 , 每个第一行的成市控制的一定是一段区间 那么 , 问题就转化为了经典的区间覆盖问题 , 贪心即可 , 时间复杂度 ...
- 引水入城 2010年NOIP全国联赛提高组(bfs+贪心)
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个遥远 ...
- Codevs 1066 引水入城 2010年NOIP全国联赛提高组
1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...
随机推荐
- composer 安装教程
https://getcomposer.org/download/ 邓士鹏 1.先检查php.ini是否开启ssl ;extension=php_openssl.dll 2. php -r &qu ...
- Spring MVC学习总结(3)——Spring3 MVC详解
DispatcherServlet 前置控制器 使用Spring MVC,配置DispatcherServlet是第一步.DispatcherServlet是一个Servlet,所以可以配置多个Dis ...
- APIO2017听课笔记关键词
- HDU 4535
裸 的错排.... #include <iostream> #include <cstdio> #include <cstring> #include <al ...
- POJ 1673
可以证明O是三角形ABC的垂心. 作图辅助线,一个很重要的技巧是延长中线等中线. 可以证明三角形DNA全等于ABC.然后通过角度变换容易证明AQ垂直于BC. #include <iostream ...
- 【BZOJ】2140 稳定婚姻
[解析]Hash,离散化.Tarjan [分析] 对于每一个名字.首先离散化成编号. 用hash或者其它,反正不要最主要的即可了.否则O(N^2L)会爆掉. 然后请參考:http://www.cnbl ...
- bootstrap模态框通过传值解决重复提交问题
自己通过模态框确认是否提交的功能时,总是重复提价上次的请求. 原因:重复的原因是jquery通过id绑定了确定按钮的onclick事件,所以每次提交都会增加 一次绑定(没有清除上次的绑定),才造成了重 ...
- rk3288的pcba模块编译调试笔记【学习笔记】
平台信息:内核:linux3.0.68 系统:android/android6.0平台:rk3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 摘要:最近在负责r ...
- Linux - shell壳脚本
shell脚本. 壳,充当一个翻译,让计算机能够认识的二进制程序,并将结果翻译给我们. 加在内核上,可以跟内核打交道的壳. 可以通过/etc/shells 来查看. [root@local ~]# c ...
- [CQOI 2007] 涂色
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1260 [算法] 区间DP [代码] #include<bits/stdc++. ...