题目链接: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. C语言初学者代码中的常见错误与瑕疵(7)

    问题: 矩形的个数 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3*1的矩形和1个3*2的矩形,总共18个矩形.给出A,B,计算可以从中找到 ...

  2. Origin双坐标轴图表

    1.空白处右键Add New Colume添加新列 2.全选各个列绘制图表 3.添加新的Y轴图层Graph—New Layer—Right-Y 4.右键左上角图层2 –Layer Contents 绑 ...

  3. fix org.openqa.selenium.NoSuchWindowException when find element on ie11.

    Steps:1.I was able to resolve the issue after adding the site URL under trusted sites of IE. The sam ...

  4. selenium webdriver三种等待方法

    webdriver三种等待方法 1.使用WebDriverWait from selenium import webdriverfrom selenium.webdriver.common.by im ...

  5. 苹果系统直接读写 ntfs 磁盘

    苹果系统对 ntfs 能读,但不能写. 方案1:修改 fstab 法 ======================================== 读写支持.在使用本教学文章之前,请先确定你没有安 ...

  6. Java总结第一次//有些图片未显示,文章包含基础java语言及各种语句

    一.java入门 1.Java入门学习框架: 2.常用的DOS命令: dir(directory) :    列出当前目录下的文件以及文件夹 md(make directory) :   创建目录 r ...

  7. 这个Glance的界面该怎么看出问题,为什么状态是SOCKT?

    这个glance的状态图有问题吗?

  8. windows win10上传文件到linux服务器

    1.最直接当然使用终端secucrt和xshell putty之类的,然后使用sz rz 2.如果服务器端不支持sz rz可以使用scp命令,下面这个pscp.exe就是支持scp的,基于ssh,很好 ...

  9. WEB前端常用网站收集

    WEB前端常用网站收集整理 w3school.w3schools 前端里.脚本之家.素材家园 17素材.frontopen NEC更好的CSS方案.一些常用的JS实例 Bootstrap  官网  h ...

  10. export

    export export PATH=$PATH:/ROOT