HDU-2295___Radar —— 二分 + DLX重复覆盖

2023-11-02 10:58

本文主要是介绍HDU-2295___Radar —— 二分 + DLX重复覆盖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:点我啊╭(╯^╰)╮

题目大意:

     n n n 个城市、 m m m 个雷达,最多可以用 k k k 个雷达,然后给出城市和雷达的坐标,要求雷达的最小覆盖半径,使得所有城市都被雷达覆盖???

解题思路:

    很清晰是一道DLX重复覆盖的题,本题的精度要精确到 1 e − 8 1e-8 1e8,所以只能用二分,二分的可行性判断是所用的雷达数是否 ≤ k ≤k k
    本题建造 01 01 01 矩阵比较简单,横坐标就是雷达,纵坐标为城市,雷达与城市之间的距离若 ≤ m i d ≤mid mid,则该点为 1 1 1

代码思路:

    主要还是重复覆盖的模板题,注意是用了 A* 的优化,估价函数 f f f 意义为从当前状态最好情况下需要添加几条边才能覆盖

核心:二分 + DLX 的简单题,同时注意精度

P S : PS: PS本题的 dfs 返回值可以为 b o o l bool bool,因为可以用当前深度与 k k k 进行比较

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;struct DancingLink{const static int N = 500010;const static int M = 1010;int n, s, ansd;	// 列数 节点总数 int S[M], A[M], H[M];	// S[]该列节点总数  A[]答案  H[]行首指针 int L[N], R[N], U[N], D[N];	// L[],R[],U[],D[] 上下左右 int X[N], C[N], vis[M];	// X[] C[] 行列编号 void init(int n){	// 初始化 this->n = n;for(int i=0; i<=n; i++)U[i]=i, D[i]=i, L[i]=i-1, R[i]=i+1;R[n]=0, L[0]=n; s=n+1;memset(S, 0, sizeof(S));memset(H, -1, sizeof(H));}void DelCol(int c){	// 删除列 for(int i=D[c]; i!=c; i=D[i])L[R[i]]=L[i], R[L[i]]=R[i];}void ResCol(int c){	// 恢复列 for(int i=U[c]; i!=c; i=U[i])L[R[i]]=R[L[i]]=i;}void AddNode(int r,int c){	// 添加节点 ++S[c], C[++s]=c, X[s]=r;D[s]=D[c], U[D[c]]=s, U[s]=c, D[c]=s;if(H[r]<0) H[r]=L[s]=R[s]=s;	// 行首节点else R[s]=R[H[r]], L[R[H[r]]]=s, L[s]=H[r], R[H[r]]=s;}int f(){int ret=0;memset(vis, 0, sizeof(vis));for(int i=R[0]; i; i=R[i])if(!vis[i]){ret++; vis[i]=1;for(int j=D[i]; j!=i; j=D[j])for(int k=R[j]; k!=j; k=R[k])vis[C[k]]=1;    }return ret;}void dfs(int d){	// 深度,深搜遍历 if(d+f() >= ansd) return;if(!R[0]){if(d<ansd) ansd=d;return;}int c=R[0];for(int i=R[0]; i; i=R[i]) if(S[i]<S[c]) c=i;for(int i=D[c]; i!=c; i=D[i]){DelCol(i); A[d]=X[i];for(int j=R[i]; j!=i; j=R[j]) DelCol(j);dfs(d+1);for(int j=L[i]; j!=i; j=L[j]) ResCol(j);ResCol(i);}}
} dlx; double eps = 1e-8;
struct point{double x, y;
} ci[60], sta[60];double dist(point a, point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}int main(){int n, m, k, cas;scanf("%d", &cas);while(cas--) {scanf("%d%d%d", &n, &m, &k);for(int i=0; i<n; i++) 	scanf("%lf%lf", &ci[i].x, &ci[i].y);for(int i=0; i<m; i++) 	scanf("%lf%lf", &sta[i].x, &sta[i].y);double l=0, r=2000, mid;while(r-l>=eps){dlx.init(n);mid = (l+r)/2;for(int i=0; i<m; i++)for(int j=0; j<n; j++)if(dist(ci[j],sta[i])<=mid)dlx.AddNode(i+1,j+1);dlx.ansd = 1<<30;dlx.dfs(0);if(dlx.ansd<=k) r = mid-eps;else l = mid+eps;}printf("%.6f\n", l);}
}

这篇关于HDU-2295___Radar —— 二分 + DLX重复覆盖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/330127

相关文章

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

nginx 负载均衡配置及如何解决重复登录问题

《nginx负载均衡配置及如何解决重复登录问题》文章详解Nginx源码安装与Docker部署,介绍四层/七层代理区别及负载均衡策略,通过ip_hash解决重复登录问题,对nginx负载均衡配置及如何... 目录一:源码安装:1.配置编译参数2.编译3.编译安装 二,四层代理和七层代理区别1.二者混合使用举例

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结