题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3564

题意:给出平面上n个点,画出一个椭圆,椭圆的长轴是短轴的p倍,且长轴的方向为x轴逆时针旋转a度。求这个椭圆短轴的最小值使得可以覆盖所以点。

思路:先将所有点顺时针旋转a,然后所有点的x缩为原来的1/p。然后就是最小圆覆盖。

const int N=50005;

struct point
{
    double x,y;

    point(double _x=0,double _y=0)
    {
        x=_x;
        y=_y;
    }

    point operator-(point a)
    {
        return point(x-a.x,y-a.y);
    }

    point operator+(point a)
    {
        return point(x+a.x,y+a.y);
    }

    double operator*(point a)
    {
        return x*a.y-y*a.x;
    }

    point operator*(double t)
    {
        return point(x*t,y*t);
    }

    point operator/(double t)
    {
        return point(x/t,y/t);
    }

    point zhuan(double ang)
    {
        return point(x*cos(ang)+y*sin(ang),x*sin(ang)-y*cos(ang));
    }

    point verl()
    {
        return point(-y,x);
    }
};

point p[N];
int n;

double dis(point a,point b)
{
    return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
}

int sgn(double x)
{
    if(x>1e-20) return 1;
    if(x<-1e-20) return -1;
    return 0;
}

point cross(point a,point b,point p,point q)
{
    double s1=(q-a)*(p-a);
    double s2=(p-b)*(q-b);

    return (a*s2+b*s1)/(s1+s2);
}

point get(point a,point b,point c)
{
    double x=(b-a)*(c-a);
    if(sgn(x)==0)
    {
        double ab=dis(a,b);
        double bc=dis(b,c);
        double ac=dis(a,c);
        if(sgn(ab-bc)>=0&&sgn(ab-ac)>=0) return (a+b)/2;
        if(sgn(bc-ab)>=0&&sgn(bc-ac)>=0) return (b+c)/2;
        return (a+c)/2;
    }
    point M1=(a+b)/2,v1=(a-b).verl();
    point M2=(b+c)/2,v2=(b-c).verl();

    return cross(M1,M1+v1,M2,M2+v2);
}

int main()
{

    scanf("%d",&n);
    int i;
    for(i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
    double ang,scal;
    scanf("%lf%lf",&ang,&scal);
    ang=ang/180*PI;
    for(i=0;i<n;i++)
    {
        p[i]=p[i].zhuan(ang);
        p[i].x/=scal;
    }

    double r=0;
    point c=p[0];
    for(i=1;i<n;i++) if(dis(p[i],c)>r+1e-10)
    {
        c=p[i]; r=0;
        int j;
        for(j=0;j<i;j++) if(dis(p[j],c)>r+1e-10)
        {
            c=(p[i]+p[j])/2;
            r=dis(p[i],p[j])/2;
            int k;
            for(k=0;k<j;k++) if(dis(p[k],c)>r+1e-10)
            {
                c=get(p[i],p[j],p[k]);
                r=max(dis(p[i],c),max(dis(p[k],c),dis(p[j],c)));
            }
        }
    }
    printf("%.3lf\n",r);
}

BZOJ 3564 信号增幅仪的更多相关文章

  1. BZOJ 3564: [SHOI2014]信号增幅仪 最小圆覆盖

    3564: [SHOI2014]信号增幅仪 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3564 Description 无线网络基站在 ...

  2. [LOJ 2190] 「SHOI2014」信号增幅仪

    [LOJ 2190] 「SHOI2014」信号增幅仪 链接 链接 题解 坐标系直到 \(x\) 轴与椭圆长轴平行 点的坐标变换用旋转公式就可以了 因为是椭圆,所以所有点横坐标除以 \(p\) 然后最小 ...

  3. [BZOJ 3564] [SHOI2014] 信号增幅仪 【最小圆覆盖】

    题目链接:BZOJ - 3564 题目分析 求最小椭圆覆盖,题目给定了椭圆的长轴与 x 轴正方向的夹角,给定了椭圆长轴与短轴的比值. 那么先将所有点旋转一个角度,使椭圆长轴与 x 轴平行,再将所有点的 ...

  4. 【bzoj3564】 [SHOI2014]信号增幅仪

    题目描述: 无线网络基站在理想状况下有效信号覆盖范围是个圆形.而无线基站的功耗与圆的半径的平方成正比. 现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站.... 就在你拿起键盘准备开 ...

  5. BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)

    如果是个圆的话好办,如果是拉成椭圆呢?直接压回去!!! 然后随机增量法就行了 CODE: #include<cstdio> #include<iostream> #includ ...

  6. BZOJ3564 信号增幅仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=3564 思路:先旋转坐标系,再缩进x坐标,把椭圆变成圆,然后做最小圆覆盖. 还有,为什么用srand( ...

  7. [SHTSC 2014] 信号增幅仪

    最小覆盖圆算法.看着题解半蒙半抄的搞过去了… 主要参考以下http://blog.csdn.net/acdreamers/article/details/9406735http://blog.csdn ...

  8. BZOJ3564 : [SHOI2014]信号增幅仪

    先把所有点绕原点逆时针旋转(360-a)度,再把所有点横坐标除以放大倍数p,最后用随机增量法求最小圆覆盖即可. 时间复杂度期望$O(n)$ #include<cstdio> #includ ...

  9. 2018.10.15 bzoj3564: [SHOI2014]信号增幅仪(坐标处理+最小圆覆盖)

    传送门 省选考最小圆覆盖? 亦可赛艇(你们什么都没看见) 在大佬的引领下成功做了出来. 就是旋转坐标使椭圆的横轴跟xxx轴平行. 然后压缩横坐标使得其变成一个圆. 然后跑最小覆盖圆就可以了. 注意题目 ...

随机推荐

  1. 手机端js模拟长按事件(代码仿照jQuery)

    代码编写: $.fn.longPress = function(fn) { var timeout = undefined; var $this = this; for(var i = 0;i< ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

    系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ...

  4. IoC 依赖注入、以及在Spring中的实现

    资源来自网络: 去年火得不行的Spring框架,一般的书籍都会从IoC和AOP开始介绍起,这个IoC概念,个人感觉资料里都写得让人看得有些痛苦,所谓IoC,就是控制反转(Inversion of Co ...

  5. 颜色表及html代码

    颜色名称及色样表(HTML版)   颜色名 中文名称 Hex RGB 十进制 Decimal     LightPink 浅粉红 #FFB6C1 255,182,193     Pink 粉红 #FF ...

  6. 使用 ViewPager 和 RadioGroup 封装的一个导航控件

    import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.dra ...

  7. 【jqGrid for ASP.NET MVC Documentation】.学习笔记.4.性能

    1 HTML / ViewState 大小 1.1 HTML 大小 jqGrid for ASP.NET MVC 使用最佳的客户端渲染,意味着 HTML gird 的 尺寸是最小的.事实上,只有 gr ...

  8. 【PHP设计模式 07_ZeRenLian.php】责任链模式

    <?php /** * [责任链模式] * 情景设置:根据不同的需求,去找相应级别的责任人解决问题 */ header("Content-type: text/html; charse ...

  9. HDU:过山车(二分图最大匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=2063 题意:有m个男,n个女,和 k 条边,求有多少对男女可以搭配. 思路:裸的二分图最大匹配,匈牙利算法. 枚 ...

  10. C#Web编程

    1.Web服务器控件可以包含服务器上调用的事件处理程序.只有送回服务器时,才在服务器上触发事件.把autoPostBack设置为true,事件将立即传给服务器.这样就会使客户端调用Javascript ...