[bzoj2517]矩形覆盖

Description

给定一个$l\;\times\;w$的矩形,和$n$个圆,求最小的$k$使得每个圆的半径$\;\times\;k$后,能覆盖整个矩形.

Input

第一行一个整数$T$,表示数据组数.

以下$T$组数据,每组数据第一行三个整数$N,L,W$,表示圆个数和矩形大小.

接下来$N$行,每行三个正整数$x[i],y[i],R[i]$表示一个圆心的坐标和原始半径.

Output

对于每组数据,输出一个实数$K$,保留$3$位小数.

Sample Input

1
1 2 2
1 1 1

Sample Output

1.414

HINT

$t\;\leq\;10,n\;\leq\;50,x[i],y[i],R[i]\;\leq\;1000$

Solution

二分$k$,分治矩形判断当前$k$是否可行:

$1.$如果当前矩形的四个顶点在同一圆内,可行;

$2.$如果当前矩形有一个顶点不在圆内,不可行;

$3.$如果当前矩形的四个顶点不在同一圆内,分成$4$部分继续判断.

#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 55
#define K 1e-7
#define eps 1e-13
using namespace std;
int n,t;
double a[N],x[N],y[N],r[N],l,w,lef,rig,mid;
inline double sqr(double x){
    return x*x;
}
inline bool in(int i,double k,double n,double m){
    double d=sqr(x[i]-n)+sqr(y[i]-m);
    return d<=sqr(r[i])+eps;
}
inline bool chk(double k,double n1,double n2,double m1,double m2){
    bool f1=0,f2=0,f3=0,f4=0;
    if(fabs(n1-n2)<eps&&fabs(m1-m2)<eps) return true;
    for(int i=1,l1,l2,l3,l4;i<=n;++i){
        l1=in(i,k,n1,m1);l2=in(i,k,n1,m2);
        l3=in(i,k,n2,m1);l4=in(i,k,n2,m2);
        if(l1&&l2&&l3&&l4) return true;
        f1|=l1;f2|=l2;f3|=l3;f4|=l4;
    }
    if(!f1||!f2||!f3||!f4) return false;
    double mm=(m1+m2)*0.5,nn=(n1+n2)*0.5;
    return chk(k,n1,nn,m1,mm)&&chk(k,n1,nn,mm,m2)      &&chk(k,nn,n2,m1,mm)&&chk(k,nn,n2,mm,m2);
}
inline void Aireen(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%lf%lf",&n,&l,&w);
        for(int i=1;i<=n;++i)
            scanf("%lf%lf%lf",&x[i],&y[i],&a[i]);
        lef=0.0;rig=l+w;
        while(lef+K<rig){
            mid=(lef+rig)*0.5;
            for(int i=1;i<=n;++i)
                r[i]=a[i]*mid;
            if(chk(mid,0.0,l,0.0,w)) rig=mid;
            else lef=mid+K;
        }
        printf("%.3lf\n",lef);
    }
}
int main(){
    freopen("cover.in","r",stdin);
    freopen("cover.out","w",stdout);
    Aireen();
    fclose(stdin);
    fclose(stdout);
    return 0;
}
时间: 2024-12-06 21:42:53

[bzoj2517]矩形覆盖的相关文章

BZOJ1185: [HNOI2007]最小矩形覆盖

传送门 旋转卡壳. 首先求凸包没什么好商量的. 然后有一个结论,如果存在一个最小的矩形覆盖,那么凸包里必定存在一条边和矩形的边重合. 自己yy一下就好啦,很容易想明白. 然后枚举每条边,移动另外三条边即可. 注意点积,叉积的结合运用什么的. //BZOJ 1185 //by Cydiater //2017.1.29 #include <iostream> #include <map> #include <ctime> #include <cmath> #in

NOIP2002 矩形覆盖

题四 矩形覆盖(存盘名NOIPG4) [问题描述]: 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴.当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4.问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢.约定:

NOIP2002矩形覆盖[几何DFS]

题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴.当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4.问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢.约定:覆盖一个点的矩形面积为 0:覆盖平行于坐标轴

HDU 5100 Chessboard 用 k &#215; 1 的矩形覆盖 n &#215; n 的正方形棋盘

点击打开链接 Chessboard Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 335    Accepted Submission(s): 168 Problem Description Consider the problem of tiling an n×n chessboard by polyomino pieces tha

1185: [HNOI2007]最小矩形覆盖

1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1426  Solved: 648[Submit][Status][Discuss] Description Input Output Sample Input Sample Output HINT Source 计算几何 vfleaking提供Spj #include<cstdio> #include<cmat

剑指OFFER之矩形覆盖(九度OJ1390)

题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=70),其中n为偶数. 输出: 对应每个测试案例, 输出用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有的方法数. 样例输入: 4 样例输出: 5 解题思路: 观察题目中的矩形,2*n的,是个长条形.本来脑中想象的是复杂的华容道,但是既然只是简单的长条形,那么

bzoj1185【HNOI2007】最小矩形覆盖

1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 1114  Solved: 505 [Submit][Status][Discuss] Description 凸包+旋转卡壳 首先有一个结论:矩形一定有一条边在凸包上,否则我们旋转之后一定会得到一个更小的矩形,脑补一下. 然后枚举凸包上的边,用旋转卡壳维护矩形的另外三条边,同时更新答案即可. #include<ios

[ACM] ZOJ 3209 Treasure Map ( Dancing Links 精确覆盖,矩形覆盖)

Treasure Map Time Limit: 2 Seconds      Memory Limit: 32768 KB Your boss once had got many copies of a treasure map. Unfortunately, all the copies are now broken to many rectangular pieces, and what make it worse, he has lost some of the pieces. Luck

洛谷 P1034 矩形覆盖

P1034 矩形覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴.当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4.问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所有点的 k 个矩形的面积之和为最小呢.约定:覆盖一个点的矩形面积为