BZOJ4622 [NOI 2003] 智破连环阵
题面
题意
有n个点需要被覆盖,你有m个半径为k的圆,每个圆覆盖的点是圆内(包括边界)编号连续的一些点,且每个圆只能使用一次,问至少要选择几个圆才能覆盖所有点。
做法
这个问题可以拆成两个子问题:
1.将n个点根据编号拆成k段。
2.判断m个圆与这k段的最大匹配是否是k。
可以发现第二个子问题可以用二分图的最大匹配轻松求解,而对于第一个子问题只能用搜索。
但是搜索的复杂度最劣为O(2^m),因此要加入一些剪枝:
1.贪心:如果圆a覆盖了点i且包含点i+1,那么一定存在一组最优解中a覆盖点i+1。
2.估价函数:考虑圆可以重复选择,那么我们就可以用dp求出后面几个点至少需要几个圆覆盖,并以此来进行最优性剪枝。
然后一边dfs,一边匹配判断此时的分组是否开行即可。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define N 110
using namespace std;int n,m,k,mx[N][N],ans,need[N],pp[N];
bool ok[N][N],have[N][N],mm[N][N],vis[N];
struct Node
{int x,y;
} wq[N],zd[N];inline int len(Node u,Node v)
{return (u.x-v.x)*(u.x-v.x)+(u.y-v.y)*(u.y-v.y);
}bool find(int u)
{int i,j;for(i=1; i<=m; i++){if(vis[i] || !mm[u][i]) continue;vis[i]=1;if(!pp[i] || find(pp[i])){pp[i]=u;return 1;}}return 0;
}void dfs(int now,int sum)
{if(need[now]+sum>=ans) return;if(now>n){ans=sum;return;}int i,j,cle[N],top;for(i=n; i>=now; i--){if(!have[now][i]) continue;top=0;for(j=1; j<=m; j++){if(mx[j][now]==i){mm[sum+1][j]=1;cle[++top]=j;}}memset(vis,0,sizeof(vis));if(find(sum+1)) dfs(i+1,sum+1);for(j=1; j<=top; j++){mm[sum+1][cle[j]]=0;if(pp[cle[j]]==sum+1) pp[cle[j]]=0;}}
}int main()
{memset(need,0x3f,sizeof(need));int i,j;cin>>n>>m>>k;k*=k;for(i=1; i<=n; i++) scanf("%d%d",&wq[i].x,&wq[i].y);for(i=1; i<=m; i++) scanf("%d%d",&zd[i].x,&zd[i].y);need[n+1]=0;for(j=n; j>=1; j--){for(i=1; i<=m; i++){if(len(zd[i],wq[j])<=k){ok[i][j]=1;ok[i][j+1]?mx[i][j]=mx[i][j+1]:mx[i][j]=j;have[j][mx[i][j]]=1;need[j]=min(need[j],need[mx[i][j]+1]+1);}}}ans=min(n,m);dfs(1,0);cout<<ans;
}
BZOJ4622 [NOI 2003] 智破连环阵相关推荐
- P1526 [NOI2003] 智破连环阵 题解
更木棒的阅读体验 /se \to→George1123 题面 NOI2003 智破连环阵 有 mm 个靶子 (ax_j,ay_j)(axj,ayj) 和 nn 个箭塔 (bx_i,by_i)(bx ...
- NOI2003 智破连环阵
先甩两个论文: 这是楼教主的 用的 部分搜索 + 匹配 代码飞快比较神 算法合集之<浅谈部分搜索+高效算法在搜索问题中的应用 这是朱泽园的算是 面向数据编程.. 用的 贪心搜索+各种剪枝( ...
- 【NOI2003】智破连环阵
题目描述 B国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过A国间谍的侦 ...
- 【21.00%】【vijos P1018】智破连环阵
描述 B国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过A国间谍的侦察发 ...
- 洛谷P1526 智破连环阵
题目描述 B 国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过 A 国间 ...
- 洛谷 P1562 智破连环阵 题解(搜索)
传送门 根据勾股定理: 一个武器 (x,y)(x,y)(x,y) 能被炸弹 (u,v)(u,v)(u,v) 攻击到 ⇔(x−u)2+(y−v)2<=k2\Leftrightarrow (x-u) ...
- COGS 336 Vijos 1018 NOI2003 智破连环阵
楼教主论文里的题 这么多剪枝吓坏我了 忽然想起来我WC的时候第一题前两个点也是搜索+最大流,不知道能不能剪枝把后面的数据水过去呢233333然而并不能想到什么剪枝 #include<iostre ...
- [NOI2003]智破连环阵
题目大意:给出地图上N个目标点,M台武器(只能用一次).每个武器启动后,将距它距离不超过K范围内的符合要求的目标全部摧毁(符合要求:摧毁目标必须按编号顺序,而且同一时刻只有一个武器是启动的),求摧毁全 ...
- XDU Problem 1037 - 智破机枪阵
裸的最大二分匹配,匈牙利算法 #include<iostream> #include<cstdio> #include<cstring> #include<c ...
最新文章
- extern “C“
- 让汽车软件进入 iPhone 时代!
- 树莓派 Ubuntu mate 18.04 修改为清华源
- 《algorithm-note》算法笔记中文版正式发布!
- 千万商家的智能决策引擎AnalyticDB
- 使用CORS解决同源限制
- HDU -2546饭卡(01背包+贪心)
- 自动生成web服务器日志解析规则
- 简单的11步在Laravel中实现测试驱动开发
- wget命令3(转载)
- java中let_Java Doclet
- 安卓自定义注解支持和示例实现
- 【Ubuntu】常用Vim插件
- 全智通A+常见问题汇总解答—A+客户应收款:总欠款和期内欠款金额不等
- 冲击2018年度第一,小米电视靠的是什么
- 文献阅读(44)—— 基于眼底照的近视深度学习算法和区块链平台,以促进人工智能医学研究:回顾性多队列研究
- Maixll-Dock 条形码识别
- 我的勇者服务器维护3月5日,时空猎人3月5日更新维护时间和更新活动内容
- 用 Python 来全自动抢微信红包
- 迅雷下载地址转换(Python3)