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 在一个遥远的国度 ...
随机推荐
- 多层下firebird自增长字段的处理
使用unidac可以解决自增长字段处理的问题. 对于多层就是一个比较烦人的事情,解决办法:cliendataset中自增长字段的处理:id:自增长字段.在client中的处理方法:clientdata ...
- Spring Cloud-hystrix使用例子(七)
继承方式 HystrixCommand public class UserSelectAllCommand extends HystrixCommand<List<User>> ...
- Spring 学习二-----AOP的原理与简单实践
一.Spring AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...
- Ural 1167 Bicolored Horses (DP)
题目地址:Ural 1167 感觉这题的思路类似于背包的做法. . 先预处理出来每一个马与之前全部的马的0的数量和1的数量,用数组a[0][i]和a[1][i]来表示. 然后再用数组dp[i][j]来 ...
- mac 下作流程图工具omnigraffle
omnigraffle:http://www.uzzf.com/soft/91710.html 含盖激活码: Name: mojado Serial: JYFE-JRJN-GSOT-GRAG-EVJI ...
- Android更新带进度条的通知栏
在网上查询了下.Android版本号更新通知栏带进度条,醉了,基本都是复制过来.有的代码不全,连源代码下载都没有.有下载也须要积分,还不能用,真黑心啊!!之前自己也写过自己定义通知栏Notificat ...
- 何时使用static类(工具类)
一个static类,指所有成员都是static方法构成的.而没有不论什么成员变量, 也称为Utility class 或者Utility Pattern [參考: Utility Pattern].它 ...
- luogu1347 排序
题目大意 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列.给你一系列形如A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序(能,矛盾,不确定).确定n个元素的顺序后 ...
- h5-7 canvas
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SQLite 常用函数
SQLite 常用函数 参考: SQLite 常用函数 | 菜鸟教程http://www.runoob.com/sqlite/sqlite-functions.html SQLite 常用函数 SQL ...