bzoj3564[SHOI2014]信號增幅儀

3564: [SHOI2014]信號增幅儀

Time Limit: 40 Sec  Memory Limit: 256 MB
Submit: 738  Solved: 290
[Submit][Status][Discuss]

Description

無線網絡基站在理想情況下有效信號覆蓋範圍是個圓形。而無線基站的功耗與圓的半徑的平方成正比。現給出平面
上若干網絡用戶的位置,請你選擇一個合適的位置建設無線基站....就在你拿起鍵盤準備開始敲代碼的時候,你的好
朋友發明家 SHTSC 忽然出現了。SHTSC 剛剛完成了他的新發明——無線信號增幅儀。增幅儀可以在不增長無線基
站功耗的前提下,使得有效信號的覆蓋範圍在某一特定方向上伸長若干倍。即:使用了增幅儀的無線基站覆蓋範圍是
個橢圓,其功耗正比於半短軸長的平方。現給出平面上若干網絡用戶的位置,請你選擇一個合適的位置建設無線基站
,並在增幅儀的幫助下使全部的用戶都能接收到信號,且無線基站的功耗最小。注意:因爲SHTSC 增幅儀的工做原理
依賴地磁場,增幅的方向是恆定的。

Input

第一行一個整數:n。平面內的用戶個數。以後的 n 行每行兩個整數 x, y,表示一個用戶的位置。第 n+2 行一個整
數:a。表示增幅儀的增幅方向,單位是度。表示增幅儀的方向是從 x 正方向逆時針轉 a 度。第 n+3 行一個整數:p
。表示增幅儀的放大倍數。

Output

輸出一行一個實數,爲可以覆蓋全部用戶的最小橢圓的半短軸長,四捨五入到三位小數。php

Sample Input

樣例一:
2
1 0
-1 0
0
2

Sample Output

樣例一:
0.500

HINT

 

對於 100%的數據,n≤50000,0≤a<180,1≤p≤100,|x|,|y|≤2×10^8。c++

 

Source

By 佚名提供網絡

座標系直到x軸與橢圓長軸平行
點的座標變換用旋轉公式就能夠了
由於是橢圓,因此全部點橫座標 除上p
而後最小圓覆蓋dom

 1 #include<bits/stdc++.h>
 2 #define N 50005
 3 using namespace std;
 4 int n,deg,p;double r;
 5 const double pi=acos(-1);
 6 struct P{
 7     double x,y;
 8     P operator - (const P &b)const{return (P){x-b.x,y-b.y};}
 9 }a[N],c;
10 
11 P rotate(P t,int tmp){
12     double rt=1.0*tmp/180*pi;P ret;
13     ret.x=t.x*cos(rt)-t.y*sin(rt);
14     ret.y=t.x*sin(rt)+t.y*cos(rt);
15     return ret;
16 }
17 double len(P a){return sqrt(a.x*a.x+a.y*a.y);}
18 P getcentre(P A,P B,P C){
19     double a1=B.x-A.x,b1=B.y-A.y,c1=(a1*a1+b1*b1)/2;
20     double a2=C.x-A.x,b2=C.y-A.y,c2=(a2*a2+b2*b2)/2;
21     double d=a1*b2-b1*a2;P ret;
22     ret.x=A.x+(c1*b2-c2*b1)/d;
23     ret.y=A.y+(c2*a1-c1*a2)/d;
24     return ret;
25 }
26 void getcircle(){
27     random_shuffle(a+1,a+1+n);
28     c=a[1];r=0;
29     for(int i=1;i<=n;i++){
30         if(len(a[i]-c)<=r)continue;
31         c=a[i];r=0;
32         for(int j=1;j<i;j++){
33             if(len(a[j]-c)<=r)continue;
34             c.x=(a[i].x+a[j].x)/2;
35             c.y=(a[i].y+a[j].y)/2;
36             r=len(a[j]-c);
37             for(int k=1;k<j;k++){
38                 if(len(a[k]-c)<=r)continue;
39                 c=getcentre(a[i],a[j],a[k]);
40                 r=len(a[i]-c);
41             }
42         }
43     }
44 }
45 int main(){
46     scanf("%d",&n);
47     for(int i=1;i<=n;i++)
48     scanf("%lf%lf",&a[i].x,&a[i].y);
49     scanf("%d%d",&deg,&p);
50     for(int i=1;i<=n;i++)
51     a[i]=rotate(a[i],-deg),a[i].x/=p;
52     getcircle();printf("%.3lf\n",r);
53     return 0;
54 }
相關文章
相關標籤/搜索