BZOJ 3564 信号增幅仪
题目链接: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 信号增幅仪的更多相关文章
- BZOJ 3564: [SHOI2014]信号增幅仪 最小圆覆盖
3564: [SHOI2014]信号增幅仪 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3564 Description 无线网络基站在 ...
- [LOJ 2190] 「SHOI2014」信号增幅仪
[LOJ 2190] 「SHOI2014」信号增幅仪 链接 链接 题解 坐标系直到 \(x\) 轴与椭圆长轴平行 点的坐标变换用旋转公式就可以了 因为是椭圆,所以所有点横坐标除以 \(p\) 然后最小 ...
- [BZOJ 3564] [SHOI2014] 信号增幅仪 【最小圆覆盖】
题目链接:BZOJ - 3564 题目分析 求最小椭圆覆盖,题目给定了椭圆的长轴与 x 轴正方向的夹角,给定了椭圆长轴与短轴的比值. 那么先将所有点旋转一个角度,使椭圆长轴与 x 轴平行,再将所有点的 ...
- 【bzoj3564】 [SHOI2014]信号增幅仪
题目描述: 无线网络基站在理想状况下有效信号覆盖范围是个圆形.而无线基站的功耗与圆的半径的平方成正比. 现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站.... 就在你拿起键盘准备开 ...
- BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)
如果是个圆的话好办,如果是拉成椭圆呢?直接压回去!!! 然后随机增量法就行了 CODE: #include<cstdio> #include<iostream> #includ ...
- BZOJ3564 信号增幅仪
http://www.lydsy.com/JudgeOnline/problem.php?id=3564 思路:先旋转坐标系,再缩进x坐标,把椭圆变成圆,然后做最小圆覆盖. 还有,为什么用srand( ...
- [SHTSC 2014] 信号增幅仪
最小覆盖圆算法.看着题解半蒙半抄的搞过去了… 主要参考以下http://blog.csdn.net/acdreamers/article/details/9406735http://blog.csdn ...
- BZOJ3564 : [SHOI2014]信号增幅仪
先把所有点绕原点逆时针旋转(360-a)度,再把所有点横坐标除以放大倍数p,最后用随机增量法求最小圆覆盖即可. 时间复杂度期望$O(n)$ #include<cstdio> #includ ...
- 2018.10.15 bzoj3564: [SHOI2014]信号增幅仪(坐标处理+最小圆覆盖)
传送门 省选考最小圆覆盖? 亦可赛艇(你们什么都没看见) 在大佬的引领下成功做了出来. 就是旋转坐标使椭圆的横轴跟xxx轴平行. 然后压缩横坐标使得其变成一个圆. 然后跑最小覆盖圆就可以了. 注意题目 ...
随机推荐
- 夺命雷公狗---Thinkphp----2之快快速搭建TP环境
<?php //定义项目目录 define('APP_PATH','./WEB/'); //开启调试 define('APP_DEBUG',True); //包含thinkphp项目入口文件 r ...
- scan design flow(一)
一个典型的scan实现的flow: clock mux和一些rst,在Scan中都被bypass掉,是不能测到的.所以DFT的test coverage一般就在97%或98%. scan design ...
- qsort函数用法(转)
qsort函数用法 qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(c ...
- 由ccf第一题引出的问题
当时的情况是这样的,代码中需要用到一个较大的二维数组,但只要定义这个大二维数组编译就出错,无奈后来用malloc自己实现了类似二维数组的操作. 其中的b数组设为全局的或者静态的也都可以解决overfl ...
- 【python】标准库的大致认识
正如那句 Python 社区中很有名的话所说的:“battery included”,Python 的一大好处在于它有一套很有用的标准库(standard library).标准库是随着 Python ...
- 初学android的第一个习作
首发:个人博客,更新&纠错&回复 项目源码在这里,因为github上传速度太差,传到了oschina的git托管上. 1.项目结构及技术点 主页面使用FragmentTabHost,5 ...
- STM32的晶振跟HSE外部时钟设置.
void RCC_Configuration(void){ /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HS ...
- symfony中twig的模板载入
模板 载入模板 {% include ‘sidebar.html’ %} 当前模板的变量也会传递到 被include的模板里,在那里面可以直接访问你这个模板的变量. {% for comment in ...
- 20145227 《Java程序设计》第3周学习总结
20145227 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 4.1 类与对象 1.定义类:生活中描述事物无非就是描述事物的属性和行为.如:人有身高,体重等属性 ...
- Android中的图片压缩
1.android中计算图片占用堆内存的kB大小跟图片本身的kB大小无关,而是根据图片的尺寸来计算的. 比如一张 480*320大小的图片占用的堆内存大小为: 480*320*4/1024=600kB ...