zoukankan      html  css  js  c++  java
  • bzoj3564: [SHOI2014]信号增幅仪

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

    3564: [SHOI2014]信号增幅仪

    Time Limit: 40 Sec  Memory Limit: 256 MB
    Submit: 553  Solved: 221
    [Submit][Status][Discuss]

    Description

    无线网络基站在理想状况下有效信号覆盖范围是个圆形。而无线基站的功耗与圆的半径的平方成正比。
    现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站....
    就在你拿起键盘准备开始敲代码的时候,你的好朋友发明家 SHTSC 突然出现了。SHTSC 刚刚完成了他的新发明——无线信号增幅仪。增幅仪能够在不增加无线基站功耗的前提下,使得有效信号的覆盖范围在某一特定方向上伸长若干倍。即:使用了增幅仪的无线基站覆盖范围是个椭圆,其功耗正比于半短轴长的平方。现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站,并在增幅仪的帮助下使所有的用户都能接收到信号,且无线基站的功耗最小。
    注意:由于SHTSC 增幅仪的工作原理依赖地磁场,增幅的方向是恒定的。

    Input

    第一行一个整数:n。平面内的用户个数。
    之后的 n 行每行两个整数 x, y,表示一个用户的位置。
    第 n+2 行一个整数:a。表示增幅仪的增幅方向,单位是度。表示增幅仪的方向是从 x 正方向逆时针转 a 度。
    第 n+3 行一个整数:p。表示增幅仪的放大倍数。

    Output

    输出一行一个实数,为能够覆盖所有用户的最小椭圆的半短轴长,四舍五入到三位小数。

    Sample Input

    样例一:
    2
    1 0
    -1 0
    0
    2
    样例二:
    3
    1 1
    -1 -1
    0 0
    4 5
    7

    Sample Output

    样例一:
    0.500
    样例二:
    0.202

    HINT

    对于 100%的数据,n≤50000,0≤a<180,1≤p≤100,|x|,|y|≤2×10^8。

    Source

     
     
    最小圆覆盖。
    其实本来是最小椭圆覆盖,但把坐标转换一下就变成最小圆覆盖了。
    凭什么加srand()就错了,浪费我好多时间……
    代码:
     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 #define maxn 50005
     7 using namespace std;
     8 int n;
     9 double r,a,t;
    10 const double eps=1e-9;
    11 struct fuck{double x,y;}p[maxn],o;
    12 fuck operator +(fuck x,fuck y){return (fuck){x.x+y.x,x.y+y.y};}
    13 fuck operator -(fuck x,fuck y){return (fuck){x.x-y.x,x.y-y.y};}
    14 fuck operator *(fuck x,double y){return (fuck){x.x*y,x.y*y};}
    15 fuck operator /(fuck x,double y){return (fuck){x.x/y,x.y/y};}
    16 double sqr(double x){return x*x;}
    17 double dis(fuck x,fuck y){return sqr(x.x-y.x)+sqr(x.y-y.y);}
    18 void get(fuck x,fuck y,double &a,double &b,double &c){
    19     a=2*(y.x-x.x);b=2*(y.y-x.y);c=(sqr(x.x)+sqr(x.y)-sqr(y.x)-sqr(y.y));
    20 }
    21 void calc(double a,double b,double c,double d,double e,double f){
    22     o.y=(a*f-c*d)/(b*d-e*a);
    23     o.x=(b*f-c*e)/(a*e-b*d);
    24 }
    25 int main(){
    26     //srand(1315313);
    27     scanf("%d",&n);
    28     for(int i=1;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
    29     scanf("%lf%lf",&a,&t);a=(1-a/360)*2*acos(-1);
    30     for(int i=1;i<=n;i++){
    31         double x=p[i].x,y=p[i].y;
    32         p[i].x=x*cos(a)-y*sin(a);p[i].x/=t;
    33         p[i].y=x*sin(a)+y*cos(a);
    34     }
    35     random_shuffle(p+1,p+n+1);
    36     o=p[1];r=0;
    37     for(int i=2;i<=n;i++)if(dis(o,p[i])>r){
    38             o=p[i];r=0;
    39             for(int j=1;j<i;j++)if(dis(p[j],o)>r){
    40                     o=(p[j]+p[i])/2;r=dis(p[j],o);
    41                     for(int k=1;k<j;k++)if(dis(p[k],o)>r){
    42                         double a,b,c,d,e,f;
    43                         get(p[i],p[j],a,b,c);get(p[j],p[k],d,e,f);
    44                         calc(a,b,c,d,e,f);r=dis(o,p[k]);
    45                     }
    46                 }
    47         }
    48     printf("%.3lf",sqrt(r));
    49 }
    View Code
  • 相关阅读:
    maven命令运行项目
    关于IDEA2020.1版本会出现maven依赖问题
    记录三十天 2020.5.7 day30
    GO
    有关IDEA的Settings常用设置(后续补充....)
    Windows下载安装 破解 idea2019.1.4
    关于tomcat9的startup.bat闪退问题&乱码
    python基础学习(十四)
    python基础学习(十三)
    IDEA常备插件推荐
  • 原文地址:https://www.cnblogs.com/longshengblog/p/5736829.html
Copyright © 2011-2022 走看看