二分答案+重复覆盖。注意返回的条件哦,不能光套模板。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std; const int maxn=3600;
const int maxc=55;
const int maxr=55;
const int inf=0x3f3f3f3f;
const double rinf=1e10;
int L[maxn], R[maxn], D[maxn], U[maxn], C[maxn];
int S[maxc], H[maxr], size;
int N,M,K;
struct City{
double x,y;
}cities[maxr];
struct Radar{
double x,y;
}radar[maxc];
double map[55][55];
///²»ÐèÒªSÓò
void Link(int r, int c)
{
S[c]++; C[size]=c;
U[size]=U[c]; D[U[c]]=size;
D[size]=c; U[c]=size;
if(H[r]==-1) H[r]=L[size]=R[size]=size;
else {
L[size]=L[H[r]]; R[L[H[r]]]=size;
R[size]=H[r]; L[H[r]]=size;
}
size++;
}
void remove(int c){
for (int i=D[c]; i!=c; i=D[i])
L[R[i]]=L[i], R[L[i]]=R[i];
}
void resume(int c){
for (int i=U[c]; i!=c; i=U[i])
L[R[i]]=R[L[i]]=i;
}
int h(){///Óþ«È·¸²¸ÇÈ¥¹ÀËã¼ôÖ¦
int ret=0;
bool vis[maxc];
memset (vis, false, sizeof(vis));
for (int i=R[0]; i; i=R[i])
{
if(vis[i])continue;
ret++;
vis[i]=true;
for (int j=D[i]; j!=i; j=D[j])
for (int k=R[j]; k!=j; k=R[k])
vis[C[k]]=true;
}
return ret;
} int ans;
bool Dance(int k){
int t=h(); //¸ù¾Ý¾ßÌåÎÊÌâÑ¡ÔñÏÞÖÆËÑË÷Éî¶È»òÖ±½ÓÇó½â¡£ A*Ëã·¨£¬´Ë´¦Ö»Çó×îÓŽâ
if(k+t>K) return false;
if(!R[0]){
return true;
}
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]){
remove(i);
for (int j=R[i]; j!=i; j=R[j])
remove(j);
if(Dance(k+1)) return true;
for (int j=L[i]; j!=i; j=L[j])
resume(j);
resume(i);
}
return false;
} void initL(int x){///col is 1~x,row start from 1
// ans=inf;
for (int i=0; i<=x; ++i){
S[i]=0;
D[i]=U[i]=i;
L[i+1]=i; R[i]=i+1;
}///¶ÔÁбíÍ·³õʼ»¯
R[x]=0;
size=x+1;///ÕæÕýµÄÔªËØ´Óm+1¿ªÊ¼
memset (H, -1, sizeof(H));
///markÿ¸öλÖõÄÃû×Ö
} double dist(int i,int j){
return sqrt((radar[i].x-cities[j].x)*(radar[i].x-cities[j].x)+(radar[i].y-cities[j].y)*(radar[i].y-cities[j].y));
} void BuildLink(double r){
for(int i=1;i<=M;i++){
for(int j=1;j<=N;j++){
if(map[i][j]<=r)
Link(i,j);
}
}
} void bin(){
double Ans;
double l=0,r=2000.0,m;
ans=inf;
while(l+1e-8<=r){
double m=(l+r)/2;
ans=inf;
initL(N);
BuildLink(m);
if(Dance(0))
{ Ans=m; r=m; }
else l=m;
}
printf("%.6lf\n",Ans);
} int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&N,&M,&K);
for(int i=1;i<=N;i++)
scanf("%lf%lf",&cities[i].x,&cities[i].y);
for(int j=1;j<=M;j++){
scanf("%lf%lf",&radar[j].x,&radar[j].y);
}
for(int i=1;i<=M;i++){
for(int j=1;j<=N;j++)
map[i][j]=dist(i,j);
}
bin();
}
return 0;
}

  

HDU 2295的更多相关文章

  1. HDU 2295 Radar (重复覆盖)

    Radar Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. hdu 2295 DLX

    思路:裸的DLX重复覆盖 #include<set> #include<cmath> #include<queue> #include<cstdio> ...

  3. HDU 2295 Radar (DLX + 二分)

    Radar Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. HDU 2295 Radar dancing links 重复覆盖

    就是dancing links 求最小支配集,重复覆盖 精确覆盖时:每次缓存数据的时候,既删除行又删除列(这里的删除列,只是删除表头) 重复覆盖的时候:只删除列,因为可以重复覆盖 然后重复覆盖有一个估 ...

  5. 搜索(DLX重复覆盖模板):HDU 2295 Radar

    Radar Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. HDU 2295.Radar (DLX重复覆盖)

    2分答案+DLX判断可行 不使用的估计函数的可重复覆盖的搜索树将十分庞大 #include <iostream> #include <cstring> #include < ...

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

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

  8. [ACM] HDU 2295 Radar (二分法+DLX 重复覆盖)

    Radar Problem Description N cities of the Java Kingdom need to be covered by radars for being in a s ...

  9. (中等) HDU 2295 , DLX+重复覆盖+二分。

    Description N cities of the Java Kingdom need to be covered by radars for being in a state of war. S ...

  10. HDU 2295 Radar (二分 + Dancing Links 重复覆盖模型 )

    以下转自 这里 : 最小支配集问题:二分枚举最小距离,判断可行性.可行性即重复覆盖模型,DLX解之. A*的启发函数: 对当前矩阵来说,选择一个未被控制的列,很明显该列最少需要1个行来控制,所以ans ...

随机推荐

  1. 【BZOJ 1572】 工作安排

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1572 [算法] 贪心 先将这些工作按截至时间排序 建立一个小根堆,当决策是否完成一项 ...

  2. B1231 [Usaco2008 Nov]mixup2 混乱的奶牛 状压dp

    发现是状压dp,但是还是不会...之前都白学了,本蒟蒻怎么这么菜,怎么都学不会啊... 其实我位运算基础太差了,所以状压学的不好. 题干: Description 混乱的奶牛 [Don Piele, ...

  3. 数据预处理之Minkowski距离计算

    template <class T1, class T2> double Minkowski(const std::vector<T1> &inst1, const s ...

  4. C语言程序创建文件

    #include <stdio.h>#include <stdlib.h>int main() { FILE *fp;if((fp=fopen("g:\\a.txt& ...

  5. pair类型 这次遇到了,记录下来,方便彼此xue习

    首先,这个pair类型是在头文件utility.h中. 一个piar保存两个数据成员,是用来生成特定类型的模板,当创建一个pair时,我们必须提供两个类型名,pair的数据成员将具有对应的类型,两个类 ...

  6. (Go)07.Go语言中strings和strconv包示例代码详解01

    1.strings使用 前缀和后缀 HasPrefix判断字符串s是否以prefix开头: 示例: package main import ( "fmt" "string ...

  7. PCB SLOT槽孔数量计算方法,同CAM350孔数一致 实现方法

    最近有好几个写脚本的朋友问我,SLOT槽孔孔的如何计算的,要求孔数与CAM350孔数保持一致. 前几年通过在CAM350里面不断测试,结果是:CAM 350中SLOT槽孔,孔与孔之间最高位,凸位高度值 ...

  8. K8S-删除Terminating状态的namespace

    kubernetes 删除Terminating状态的命名空间 1.检查该namespace下是否还有资源: kubectl get all --namespace=cattle-system 2.删 ...

  9. OpenCV:Adaboost训练时数据扩增

    更准确的模型需要更多的数据,对于传统非神经网络机器学习方法,不同的特征需要有各自相符合的数据扩增方法. 1.   在使用opencv_traincascade.exe 过程中,图像读取在 classi ...

  10. HDU_1907_基础博弈nim游戏

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...