【NOIP2010】引水入城 DFS+贪心

本文介绍了一种使用深度优先搜索(DFS)算法确定网格中每个点所能控制的区域的方法,并通过线段覆盖算法解决去除冗余线段以实现区间完全覆盖的问题。文章提供了具体的实现思路及代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目有图,不附了,好麻烦……

http://codevs.cn/problem/1066/


我的想法是:对于第一排每个点都做一遍dfs,获得它能控制的区间(回溯时更新)。

可以证得,如果它控制的区间不是一个(也就是中间有中断),那么必定不可全部覆盖。

每个点一遍dfs,时间复杂度太高,还有可能爆栈,记忆化一下就好了,这样的话时间复杂度也可以承受,这玩意我写疵了…调了好久…早知道就不做死打dfs了……bfs其实蛮好写的……

dfs可以设maps[i][j]保存两个值: < i , j > 这个点所控制的区间的左右端点,然后如果搜到了已经搜过的点,就直接利用maps更新即可。

接下来是线段覆盖:给你一堆线段,去掉尽量多的线段,使得剩下的线段能覆盖整个区间。

然后我看了看黄学长标程(智商低…),大概是这样:

先按左端点升序为第一关键字,右端点升序为第二关键字排序。

设两个变量:now和to,表示当前最大扩展到第now位,下一个区间最大可以扩展到第to位。若now+1>=l[i].l(表示当前区间可以和now接上,中间不留空隙),则更新to,直到不满足上面那个关系,即可选最后更新to的区间(其实我们并不关心到底是哪个区间)。
最后别忘了,如果now到不了最右端,则ans++;

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值