hdu 2295 Radar(二分+DLX)
题目链接:hdu 2295 Radar
题意:
给你n个城市,m个雷达,现在最多用K个雷达,求最小半径覆盖全部的城市。
题解:
二分半径套一个DLX就行。网上随便找的一个板子
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 const double eps=1e-7; 5 6 struct Point{ 7 double x,y; 8 }city[100],radar[100]; 9 double dis[55][55]; 10 double dist(Point a,Point b){ 11 double s=a.x-b.x,t=a.y-b.y; 12 return s*s+t*t; 13 } 14 15 int K; 16 17 struct DLX{ 18 const static int mn=20010; 19 #define FF(i,A,s) for(int i=A[s];i!=s;i=A[i]) 20 #define INF 0x3f3f3f3f 21 int L[mn],R[mn],U[mn],D[mn]; 22 int size,col[mn],row[mn],s[mn],H[mn]; 23 bool vis[70]; 24 int ans[mn],cnt; 25 void init(int m){ 26 F(i,0,m)L[i]=i-1,R[i]=i+1,U[i]=D[i]=i,s[i]=0; 27 memset(H,-1,sizeof(H)); 28 L[0]=m;R[m]=0;size=m+1; 29 } 30 void link(int r,int c){ 31 U[size]=c;D[size]=D[c];U[D[c]]=size;D[c]=size; 32 if(H[r]<0)H[r]=L[size]=R[size]=size; 33 else L[size]=H[r],R[size]=R[H[r]],L[R[H[r]]]=size,R[H[r]]=size; 34 s[c]++,col[size]=c,row[size]=r,size++; 35 } 36 void del(int c){ 37 L[R[c]]=L[c];R[L[c]]=R[c]; 38 FF(i,D,c)FF(j,R,i)U[D[j]]=U[j],D[U[j]]=D[j],--s[col[j]]; 39 } 40 void add(int c){ 41 R[L[c]]=L[R[c]]=c; 42 FF(i,U,c)FF(j,L,i)++s[col[U[D[j]]=D[U[j]]=j]]; 43 } 44 bool dfs(int k){//精确覆盖 45 if(!R[0]){ 46 cnt=k;return 1; 47 } 48 int c=R[0];FF(i,R,0)if(s[c]>s[i])c=i; 49 del(c); 50 FF(i,D,c){ 51 FF(j,R,i)del(col[j]); 52 ans[k]=row[i];if(dfs(k+1))return 1; 53 FF(j,L,i)add(col[j]); 54 } 55 add(c); 56 return 0; 57 } 58 void remove(int c){FF(i,D,c)L[R[i]]=L[i],R[L[i]]=R[i];}//重复覆盖 59 void resume(int c){FF(i,U,c)L[R[i]]=R[L[i]]=i;} 60 int A(){//估价函数 61 int res=0; 62 memset(vis,0,sizeof(vis)); 63 FF(i,R,0)if(!vis[i]){ 64 res++;vis[i]=1; 65 FF(j,D,i)FF(k,R,j)vis[col[k]]=1; 66 } 67 return res; 68 } 69 void dfs(int now,int &ans){//重复覆盖 70 if(R[0]==0)ans=min(ans,now); 71 else if(now+A()<ans){ 72 int temp=INF,c; 73 FF(i,R,0)if(temp>s[i])temp=s[i],c=i; 74 FF(i,D,c){ 75 remove(i);FF(j,R,i)remove(j); 76 dfs(now+1,ans); 77 FF(j,L,i)resume(j);resume(i); 78 } 79 } 80 } 81 }dlx; 82 83 int main() 84 { 85 int t,n,m; 86 scanf("%d",&t); 87 while(t--){ 88 scanf("%d%d%d",&n,&m,&K); 89 for(int i=1;i<=n;i++)scanf("%lf%lf",&city[i].x,&city[i].y); 90 for(int i=1;i<=m;i++)scanf("%lf%lf",&radar[i].x,&radar[i].y); 91 F(i,1,m)F(j,1,n)dis[i][j]=dist(radar[i],city[j]); 92 double l=0,r=1000; 93 while(r-l>eps){ 94 double mid=(l+r)/2,ss=mid*mid; 95 dlx.init(n); 96 F(i,1,m)F(j,1,n)if(dis[i][j]<=ss)dlx.link(i,j); 97 int ans=INF; 98 dlx.dfs(0,ans); 99 if(ans>K)l=mid;else r=mid; 100 } 101 printf("%.6f\n",l); 102 } 103 return 0; 104 }
View Code
转载于:https://www.cnblogs.com/bin-gege/p/6360265.html
hdu 2295 Radar(二分+DLX)相关推荐
- hdu 2295 Radar DLX 重复覆盖问题
http://acm.hdu.edu.cn/showproblem.php?pid=229 题意: 一个国家有n个城市,m个雷达,我们同时操作的雷达数最多为k,给出城市与国家的坐标,求小于等于k的操作 ...
- hdu 2295 Radar 重复覆盖+二分
题目链接 给m个雷达, n个城市, 以及每个城市的坐标, m个雷达里只能使用k个, 在k个雷达包围所有城市的前提下, 求最小半径. 先求出每个雷达到所有城市的距离, 然后二分半径, 如果距离小于二分的 ...
- hdu 2298 Radar 重复覆盖
#include <bits/stdc++.h> using namespace std; struct DLX {const static int maxn=64,maxm=64,max ...
- hdu 3641 数论 二分求符合条件的最小值数学杂题
http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*================================= ...
- hdu 1281棋盘游戏(二分匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格 ...
- hdu 4190(二分)
思路:二分答案每次验证一下是否可行. 代码如下: 1 /************************************************** 2 * Author : xiaohao ...
- hdu 3585(二分+最大团)
如果对团的知识不够了解的可以看看牛人的 http://www.cnblogs.com/pushing-my-way/archive/2012/08/08/2627993.html 题意:有n个点求最远 ...
- hdu 4768 Flyer 二分
http://acm.hdu.edu.cn/showproblem.php?pid=4768 思路: 解题关键是奇数+偶数=奇数,然后我们就是枚举奇数位置(奇数为就一个或者0个),然后计算左边的和是否 ...
- hdu 5101(二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5101 题意:给定一些集合,选择两个来自不同集合的数,加和大于k,问有多少种选择方案 答案=从所有数中选 ...
最新文章
- C++ mutable
- 【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
- oracle sys sysman system 介绍
- CTF个人总结指南(更新中)
- linux oracle swd.oui,centos7安装oracle11g报错,请问怎么解?
- [LoadRunner]UTF8字符格式
- cloudera-quickstart-vm-5.13.0-0-virtualbox 中文显示乱码
- 认识星座、八大行星的观察
- eff java_牛津大学为国家图书馆周开幕,EFF组织大学活动家,等等
- Java equals()方法和hashCode()方法
- MiniProfiler.EF6监控调试MVC5和EF6的性能
- python数据结构5 - 排序与搜索
- SQL——Hibernate SQL增删改查
- ORACLE检查点测试,oracle深度解析检查点
- redis实现排行查询及排序及分页
- 自我保护第一课加密与防破解
- 安全报告处理 HCL AppScan Standard
- 不同走法的象棋能否走完整个棋盘问题
- Python实现视频转 gif 动图
- 重装系统:利用微PE制作U盘为启动盘,重装win7旗舰版(win10等也一样)