题目链接: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)相关推荐

  1. hdu 2295 Radar DLX 重复覆盖问题

    http://acm.hdu.edu.cn/showproblem.php?pid=229 题意: 一个国家有n个城市,m个雷达,我们同时操作的雷达数最多为k,给出城市与国家的坐标,求小于等于k的操作 ...

  2. hdu 2295 Radar 重复覆盖+二分

    题目链接 给m个雷达, n个城市, 以及每个城市的坐标, m个雷达里只能使用k个, 在k个雷达包围所有城市的前提下, 求最小半径. 先求出每个雷达到所有城市的距离, 然后二分半径, 如果距离小于二分的 ...

  3. hdu 2298 Radar 重复覆盖

    #include <bits/stdc++.h> using namespace std; struct DLX {const static int maxn=64,maxm=64,max ...

  4. hdu 3641 数论 二分求符合条件的最小值数学杂题

    http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*================================= ...

  5. hdu 1281棋盘游戏(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格 ...

  6. hdu 4190(二分)

    思路:二分答案每次验证一下是否可行. 代码如下: 1 /************************************************** 2 * Author : xiaohao ...

  7. hdu 3585(二分+最大团)

    如果对团的知识不够了解的可以看看牛人的 http://www.cnblogs.com/pushing-my-way/archive/2012/08/08/2627993.html 题意:有n个点求最远 ...

  8. hdu 4768 Flyer 二分

    http://acm.hdu.edu.cn/showproblem.php?pid=4768 思路: 解题关键是奇数+偶数=奇数,然后我们就是枚举奇数位置(奇数为就一个或者0个),然后计算左边的和是否 ...

  9. hdu 5101(二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5101 题意:给定一些集合,选择两个来自不同集合的数,加和大于k,问有多少种选择方案 答案=从所有数中选 ...

最新文章

  1. C++ mutable
  2. 【透明版九宫格背景图片】仅依靠background的几个属性组合搭配出酷炫的透明背景卡片效果→适用于大数据可视化、数据大屏展示页面
  3. oracle sys sysman system 介绍
  4. CTF个人总结指南(更新中)
  5. linux oracle swd.oui,centos7安装oracle11g报错,请问怎么解?
  6. [LoadRunner]UTF8字符格式
  7. cloudera-quickstart-vm-5.13.0-0-virtualbox 中文显示乱码
  8. 认识星座、八大行星的观察
  9. eff java_牛津大学为国家图书馆周开幕,EFF组织大学活动家,等等
  10. Java equals()方法和hashCode()方法
  11. MiniProfiler.EF6监控调试MVC5和EF6的性能
  12. python数据结构5 - 排序与搜索
  13. SQL——Hibernate SQL增删改查
  14. ORACLE检查点测试,oracle深度解析检查点
  15. redis实现排行查询及排序及分页
  16. 自我保护第一课加密与防破解
  17. 安全报告处理 HCL AppScan Standard
  18. 不同走法的象棋能否走完整个棋盘问题
  19. Python实现视频转 gif 动图
  20. 重装系统:利用微PE制作U盘为启动盘,重装win7旗舰版(win10等也一样)

热门文章

  1. 《windows中GSX的管理》之四——cmware-cmd实例
  2. [转]计算机存储 cache介绍
  3. VS2017 ASP.NET MVC 5.0 开部署问题汇总
  4. Y Combinator
  5. http协议常见的响应头
  6. *[topcoder]TheTree
  7. Spoken English(021)
  8. 自己动手写C语言编译器(2)
  9. Ubuntu 安装 搜狗输入法
  10. 互联网思维-NO.1思维(2)