题面

题意

有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] 智破连环阵相关推荐

  1. P1526 [NOI2003] 智破连环阵 题解

    更木棒的阅读体验 /se \to→George1123 题面 NOI2003 智破连环阵 有 mm 个靶子 (ax_j,ay_j)(axj​,ayj​) 和 nn 个箭塔 (bx_i,by_i)(bx ...

  2. NOI2003 智破连环阵

    先甩两个论文: 这是楼教主的 用的 部分搜索 + 匹配   代码飞快比较神 算法合集之<浅谈部分搜索+高效算法在搜索问题中的应用 这是朱泽园的算是 面向数据编程..  用的 贪心搜索+各种剪枝( ...

  3. 【NOI2003】智破连环阵

    题目描述 B国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过A国间谍的侦 ...

  4. 【21.00%】【vijos P1018】智破连环阵

    描述 B国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过A国间谍的侦察发 ...

  5. 洛谷P1526 智破连环阵

    题目描述 B 国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过 A 国间 ...

  6. 洛谷 P1562 智破连环阵 题解(搜索)

    传送门 根据勾股定理: 一个武器 (x,y)(x,y)(x,y) 能被炸弹 (u,v)(u,v)(u,v) 攻击到 ⇔(x−u)2+(y−v)2<=k2\Leftrightarrow (x-u) ...

  7. COGS 336 Vijos 1018 NOI2003 智破连环阵

    楼教主论文里的题 这么多剪枝吓坏我了 忽然想起来我WC的时候第一题前两个点也是搜索+最大流,不知道能不能剪枝把后面的数据水过去呢233333然而并不能想到什么剪枝 #include<iostre ...

  8. [NOI2003]智破连环阵

    题目大意:给出地图上N个目标点,M台武器(只能用一次).每个武器启动后,将距它距离不超过K范围内的符合要求的目标全部摧毁(符合要求:摧毁目标必须按编号顺序,而且同一时刻只有一个武器是启动的),求摧毁全 ...

  9. XDU Problem 1037 - 智破机枪阵

    裸的最大二分匹配,匈牙利算法 #include<iostream> #include<cstdio> #include<cstring> #include<c ...

最新文章

  1. extern “C“
  2. 让汽车软件进入 iPhone 时代!
  3. 树莓派 Ubuntu mate 18.04 修改为清华源
  4. 《algorithm-note》算法笔记中文版正式发布!
  5. 千万商家的智能决策引擎AnalyticDB
  6. 使用CORS解决同源限制
  7. HDU -2546饭卡(01背包+贪心)
  8. 自动生成web服务器日志解析规则
  9. 简单的11步在Laravel中实现测试驱动开发
  10. wget命令3(转载)
  11. java中let_Java Doclet
  12. 安卓自定义注解支持和示例实现
  13. 【Ubuntu】常用Vim插件
  14. 全智通A+常见问题汇总解答—A+客户应收款:总欠款和期内欠款金额不等
  15. 冲击2018年度第一,小米电视靠的是什么
  16. 文献阅读(44)—— 基于眼底照的近视深度学习算法和区块链平台,以促进人工智能医学研究:回顾性多队列研究
  17. Maixll-Dock 条形码识别
  18. 我的勇者服务器维护3月5日,时空猎人3月5日更新维护时间和更新活动内容
  19. 用 Python 来全自动抢微信红包
  20. 迅雷下载地址转换(Python3)

热门文章

  1. 试用期没过,因在公司上了 1024 网站...
  2. 线性代数行列式计算方法之三角法
  3. 微信二次开发资源整理
  4. windows server 2016桌面添加 此电脑 我的电脑 计算机 图标
  5. 欢迎使用Markdown编辑器
  6. 飞飞影视php 漏洞,飞飞影视SQL injection exploit[转]
  7. 信息的定义与特征,构成世界的三大要素:物质、能量、信息
  8. contiki学习笔记(九)文件系统CFS
  9. VC6.0快捷键一览表
  10. vc6.0 如何添加全局变量