【SHTSC2014】信号增幅仪
2018-01-31 22:42
309 查看
Description
无线网络基站在理想状况下有效信号覆盖范围是个圆形。而无线基站的功耗与圆的半径的平方成正比。现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站 ……就在你拿起键盘准备开始敲代码的时候,你的好朋友发明家SHTSC突然出现了。SHTSC刚刚完成了他的新发明——无线信号增幅仪。增幅仪能够在不增加无线基站功耗的前提下,使得有效信号的覆盖范围在某一特定方向上伸长若干倍。即:使用了增幅仪的无线基站覆盖范围是个椭圆,其功耗正比于半短轴长的平方。
现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站,并在增幅仪的帮助下使所有的用户都能接收到信号,且无线基站的功耗最小。
注意:由于SHTSC增幅仪的工作原理依赖地磁场,增幅的方向是恒定的。
Input
第一行一个整数:n。平面内的用户个数。之后的n行每行两个整数x, y,表示一个用户的位置。
第n+2行一个整数:a。表示增幅仪的增幅方向,单位是度。表示增幅仪的方向是从x正方向逆时针转a度。
第n+3行一个整数:p。表示增幅仪的放大倍数。
Output
输出一行一个实数,为能够覆盖所有用户的最小椭圆的半短轴长,四舍五入到三位小数。Sample Input
输入1:2
1 0
-1 0
0
2
输入2:
3
1 1
-1 -1
0 0
45
7
Sample Output
输出1:0.500
输出2:
0.202
Data Constraint
对于10%的数据,保证最优方案的中心在原点。对于20%的数据,保证点是随机生成的。
对于30%的数据,n≤100。
对于50%的数据,n≤5000。
对于100%的数据,n≤50000,0≤a<180,1≤p≤100,|x|,|y|≤2×10^8。
Analysis
怎么做呢?考虑一波玄学操作
把坐标轴翻转过来(要用到一波三角函数的知识),使得x轴和被增长方向重合
然后,放大就等于把每个点的横坐标缩小
这个时候 这个问题就变成了一个最小圆覆盖问题
可以运用随机化算法来解决 看似n^3的写法在实际上其实是o(n)的
具体就是很暴力的操作
考虑两个点在圆上还是三个点在圆上(求外心即可)
Code
#include <cstring> #include <algorithm> #include <cstdio> #include <cmath> #define fo(i,a,b) for(i=a;i<=b;i++) #define db double using namespace std; typedef long long ll; const int maxn=50005; const double pi=acos(-1); struct edge{ db x,y; } a[maxn]; int n,i,x,y,d,p; db r; int read(){ int sum=0; char c=getchar(); int p=1; while (c<'0'||c>'9'){ if (c=='-') p=-1; c=getchar(); } while (c>='0'&&c<='9'){ sum=sum*10+c-'0'; c=getchar(); } return sum*p; } db dis(edge a,edge b){a.x=a.x-b.x; a.y=a.y-b.y; return sqrt(a.x*a.x+a.y*a.y);} edge rot(edge t,int p){ db tri=1.0*p/180*pi; edge h; h.x=t.x*cos(tri)-t.y*sin(tri); h.y=t.x*sin(tri)+t.y*cos(tri); return h; } edge centre(edge A,edge B,edge C){ db a1=B.x-A.x,b1=B.y-A.y,c1=(a1*a1+b1*b1)/2; db a2=C.x-A.x,b2=C.y-A.y,c2=(a2*a2+b2*b2)/2; db d=a1*b2-b1*a2;edge ret; ret.x=A.x+(c1*b2-c2*b1)/d; ret.y=A.y+(c2*a1-c1*a2)/d; return ret; } void get(){ int i,j,k; random_shuffle(a+1,a+n+1); edge c=a[1];r=0; fo(i,1,n){ if (dis(a[i],c)<=r) continue; c=a[i],r=0; fo(j,1,i-1) { if (dis(a[j],c)<=r) continue; c.x=(a[i].x+a[j].x)/2,c.y=(a[i].y+a[j].y)/2; r=dis(a[j],c); fo(k,1,j-1){ if (dis(a[k],c)<=r) continue; c=centre(a[i],a[j],a[k]); r=dis(a[i],c); } } } } int main(){ freopen("amplifier.in","r",stdin); freopen("amplifier.out","w",stdout); scanf("%d",&n); fo(i,1,n) { x=read(),y=read(); a[i].x=x*1.0,a[i].y=y*1.0; } scanf("%d%d",&d,&p); fo(i,1,n) a[i]=rot(a[i],-d),a[i].x/=p; get(); printf("%.3lf\n",r); }
相关文章推荐
- January 31st 模拟赛A T2 【SHTSC2014】信号增幅仪 Solution
- JZOJ-senior-3660. 【SHTSC2014】信号增幅仪(amplifier)
- jzoj 3660. 【SHTSC2014】信号增幅仪
- BZOJ3564.【SHTSC2014】信号增幅仪(amplifier)
- 【SHTSC2014】信号增幅仪
- 【SHTSC2014】信号增幅仪
- BZOJ 3564 SHOI2014 信号增幅仪 随机增量法
- BZOJ 3564 SHOI 2014 信号增幅仪 坐标变换+最小圆覆盖
- bzoj3564: [SHOI2014]信号增幅仪 最小圆覆盖
- BZOJ3564 : [SHOI2014]信号增幅仪
- bzoj3564[SHOI2014]信号增幅仪
- BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)
- JZOJ 3660. 【SHTSC2014】信号增幅仪
- 【SHTSC2014】信号增幅仪
- BZOJ3564 [SHOI2014]信号增幅仪
- BZOJ 3564: [SHOI2014]信号增幅仪 最小圆覆盖
- [BZOJ 3564] [SHOI2014] 信号增幅仪 【最小圆覆盖】
- bzoj3564 信号增幅仪【最小圆覆盖+坐标变换】
- BZOJ 3564 信号增幅仪
- jzoj 3661. 【SHTSC2014】概率充电器