最小覆盖圆算法。看着题解半蒙半抄的搞过去了…

主要参考以下
http://blog.csdn.net/acdreamers/article/details/9406735
http://blog.csdn.net/lthyxy/article/details/6661250
http://blog.himdd.com/archives/2666

其中有一个求外心的过程是错的…害我调了好久…还把x和y搞反…可是就算是错的我居然过了80%的数据…

仍然几个疑问:

(1)最小覆盖圆算法时间复杂度的证明

(2)椭圆的中心未定的情况下,为什么以原点为中心旋转&缩放即可?(我几何不好QAQ)

program amplifier;
uses math;
type point=record
x,y:extended;
end;
const maxn=;
pi=3.14159265358979;
eps=0.00000001;
var n,i,p:longint;
a,r:extended;
o:point;
v:array[..maxn+] of point;
procedure rotate(i:longint);
var x,y:extended;
begin
x:=v[i].x*cos(-a)-v[i].y*sin(-a);
y:=v[i].x*sin(-a)+v[i].y*cos(-a);
v[i].x:=x/p;
v[i].y:=y;
end; function circumcenter(p,q,r:point):point;
var a,b,c,d,e,f:extended;
begin
a:=q.x-p.x;
b:=q.y-p.y;
c:=-(q.x*q.x+q.y*q.y-p.x*p.x-p.y*p.y)/;
d:=r.x-p.x;
e:=r.y-p.y;
f:=-(r.x*r.x+r.y*r.y-p.x*p.x-p.y*p.y)/;
circumcenter.y:=(-c*d+f*a)/(b*d-e*a);
circumcenter.x:=(-c*e+f*b)/(a*e-b*d);
end; function dis(a,b:point):extended;
begin
dis:=sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
end; procedure min_cover_circle;
var i,j,k:longint;
begin
o:=v[];r:=;
for i:= to n do
begin
if dis(v[i],o)>r+eps then
begin
o:=v[i];r:=;
for j:= to i do
if dis(v[j],o)>r+eps then
begin
o.x:=(v[i].x+v[j].x)/;
o.y:=(v[i].y+v[j].y)/;
r:=dis(v[j],o);
for k:= to j do
if dis(v[k],o)>r+eps then
begin
o:=circumcenter(v[i],v[j],v[k]);
r:=dis(o,v[i]);
end;
end;
end;
end;
end; begin
//assign(input,'amplifier20.in');reset(input);
//assign(output,'amplifier20.out');rewrite(output);
readln(n);
for i:= to n do
readln(v[i].x,v[i].y);
readln(a);a:=a/*pi;
readln(p);
for i:= to n do
rotate(i);
if n= then
begin
writeln(dis(v[],v[])/::);
//close(input);close(output);
halt;
end;
min_cover_circle;
writeln(r::);
//close(input);close(output);
end.

amplifier

其实说起来也不是很难,增量法我在考场居然也想到了,就是那时没想到可以以原点为中心,算法也写的有问题- -
来一发考场逗比错误代码,有空分析下错哪里了0 0

program amplifier;
uses math;
const pi=3.141592653589;
type vtype=record
x,y:real;
end;
var n,p,i,n1,n2,n3:longint;
xx,yy,xt,yt,a,aa,x0,y0:real;
v:array[..] of vtype; procedure cac(x1,y1,x2,y2,x3,y3:real);
var a1,a2,b1,b2,c1,c2:real;
begin
if x1*y2+x2*y3+x3*y1-x3*y2-x2*y1-x1*y3= then exit;
a1:=*(x1-x3);b1:=*p*p*(y1-y3);c1:=(x1*x1-x3*x3)+p*p*(y1*y1-y3*y3);
a2:=*(x1-x2);b2:=*p*p*(y1-y2);c2:=(x1*x1-x2*x2)+p*p*(y1*y1-y2*y2);
xt:=(b2*c1-b1*c2)/(a1*b2-a2*b1);
yt:=(a1*c2-a2*c1)/(a1*b2-a2*b1);
a:=sqrt(sqr(x1-xt)+p*p*sqr(y1-yt));
end; function ini(t:integer;x0,y0,a:real):boolean;
var tt:real;
begin
tt:=sqr(v[t].x-x0)+p*p*sqr(v[t].y-y0);
if tt<=a*a then exit(true) else exit(false);
end; procedure work2;
begin
xx:=(v[n1].x+v[n2].x)/;
yy:=(v[n1].y+v[n2].y)/;
a:=sqrt(sqr(v[n1].x-xx)+p*p*sqr(v[n1].y-yy));
writeln((a/p)::);
end; function line(n1,n2,n3:integer):boolean;
var x1,x2,x3,y1,y2,y3:real;
begin
x1:=v[n1].x;x2:=v[n2].x;x3:=v[n3].x;
y1:=v[n1].y;y2:=v[n2].y;y3:=v[n3].y;
if x1*y2+x2*y3+x3*y1-x3*y2-x2*y1-x1*y3= then exit(true) else exit(False);
end; procedure workline;
begin
if ((v[n1].x<v[n2].x) and (v[n2].x<v[n3].x)) or ((v[n3].x<v[n2].x) and (v[n2].x<v[n1].x)) then
begin
n2:=n3;n3:=n3+;exit;
end;
if ((v[n2].x<v[n1].x) and (v[n1].x<v[n3].x)) or ((v[n3].x<v[n1].x) and (v[n1].x<v[n2].x)) then
begin
n1:=n2;n2:=n3;n3:=n3+;exit;
end;
if ((v[n1].x<v[n3].x) and (v[n3].x<v[n2].x)) or ((v[n2].x<v[n3].x) and (v[n3].x<v[n1].x)) then
begin
n3:=n3+; exit;
end;
end; begin
assign(input,'amplifier.in');reset(input);
assign(output,'amplifier.out');rewrite(output);
readln(n);
for i:= to n do
readln(v[i].x,v[i].y);
readln(a);readln(p);
for i:= to n do
begin
x0:=v[i].x;y0:=v[i].y;
v[i].x:=cos(-a/*pi)*x0-sin(-a/*pi)*y0;
v[i].y:=sin(-a/*pi)*x0+cos(-a/*pi)*y0;
end;
v[n+].x:=;v[n+].y:=;
if n= then writeln();
if n= then
begin
n1:=;n2:=;
work2;
end;
if n>= then
begin
n1:=;n2:=;n3:=;
while (line(n1,n2,n3)) and (n3<>n+) do workline;
if n3=n+ then
begin
work2;
exit;
end;
cac(v[n1].x,v[n1].y,v[n2].x,v[n2].y,v[n3].x,v[n3].y);
xx:=xt;yy:=yt;aa:=a;
for i:=n3+ to n do
begin
if not ini(i,xx,yy,aa) then
begin
cac(v[n1].x,v[n1].y,v[n2].x,v[n2].y,v[i].x,v[i].y);
if ini(n3,xt,yt,a) then
begin
n3:=i;xx:=xt;yy:=yt;aa:=a;continue;
end;
cac(v[n1].x,v[n1].y,v[i].x,v[i].y,v[n3].x,v[n3].y);
if ini(n2,xt,yt,a) then
begin
n2:=n3;n3:=i;xx:=xt;yy:=yt;aa:=a;continue;
end;
cac(v[i].x,v[i].y,v[n2].x,v[n2].y,v[n3].x,v[n3].y);
if ini(n1,xt,yt,a) then
begin
n1:=n2;n2:=n3;n3:=i;xx:=xt;yy:=yt;aa:=a;continue;
end;
end;
end;
writeln((a/p)::);
end;
close(input);close(output);
end.

amplifier-wrong

[SHTSC 2014] 信号增幅仪的更多相关文章

  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. 【bzoj3564】 [SHOI2014]信号增幅仪

    题目描述: 无线网络基站在理想状况下有效信号覆盖范围是个圆形.而无线基站的功耗与圆的半径的平方成正比. 现给出平面上若干网络用户的位置,请你选择一个合适的位置建设无线基站.... 就在你拿起键盘准备开 ...

  4. BZOJ3564 : [SHOI2014]信号增幅仪

    先把所有点绕原点逆时针旋转(360-a)度,再把所有点横坐标除以放大倍数p,最后用随机增量法求最小圆覆盖即可. 时间复杂度期望$O(n)$ #include<cstdio> #includ ...

  5. BZOJ 3564 信号增幅仪

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3564 题意:给出平面上n个点,画出一个椭圆,椭圆的长轴是短轴的p倍,且长轴的方向为x轴逆时 ...

  6. [BZOJ 3564] [SHOI2014] 信号增幅仪 【最小圆覆盖】

    题目链接:BZOJ - 3564 题目分析 求最小椭圆覆盖,题目给定了椭圆的长轴与 x 轴正方向的夹角,给定了椭圆长轴与短轴的比值. 那么先将所有点旋转一个角度,使椭圆长轴与 x 轴平行,再将所有点的 ...

  7. BZOJ3564 信号增幅仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=3564 思路:先旋转坐标系,再缩进x坐标,把椭圆变成圆,然后做最小圆覆盖. 还有,为什么用srand( ...

  8. BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)

    如果是个圆的话好办,如果是拉成椭圆呢?直接压回去!!! 然后随机增量法就行了 CODE: #include<cstdio> #include<iostream> #includ ...

  9. 2018.10.15 bzoj3564: [SHOI2014]信号增幅仪(坐标处理+最小圆覆盖)

    传送门 省选考最小圆覆盖? 亦可赛艇(你们什么都没看见) 在大佬的引领下成功做了出来. 就是旋转坐标使椭圆的横轴跟xxx轴平行. 然后压缩横坐标使得其变成一个圆. 然后跑最小覆盖圆就可以了. 注意题目 ...

随机推荐

  1. 如何在IamgeButton上面添加文字

    如何在IamgeButton上面添加文字? 首先要知道,IamgeButton是不可以直接添加文字的.所以我们需要间接制作一个Button按钮 我的代码将会展示另外一个例子,与本文中的代码相似. 本文 ...

  2. 看守所、戒毒所3D指纹门禁系统解决方案

    为响应"科技强警"的战略方针,华本构建了一个完整的.集成的.可靠的.易操作的高安全性门禁系统,应用于看守所.戒毒所.公安局和部队等单位,使管理更现代化.规范化,有效地预防和制止越狱 ...

  3. [原]Linux ssh远程连接断开问题处理办法

    我们在通过远程连接操作Linux server的时候,有可能过一段时间忘记操作,便会发生ssh断开的问题. 而如果是本地的server,比较好办,直连设备kill掉ssh,踢掉无效用户连接,再次链接即 ...

  4. ubuntu服务管理

    uRedhat 提供了chkconfig这个命令来管理系统在不同运行级别下的服务开启/关闭: chkconfig ServiceName on/off 并可以用chkconfig --list(两个杠 ...

  5. Js dom操作总结

    1.选取文档元素 1.1. getElemenById 基于唯一id获取,任何HTML元素可以有id属性,在文档中该值必须唯一. 1.2. getElementsByName 基于name属性的值选取 ...

  6. JSON,Bean,XML,List,Map

    http://blog.csdn.net/superit401/article/details/51728929 JSON-lib这个Java类包用于把bean,map和XML转换成JSON并能够把J ...

  7. VB模拟键盘输入的N种方法

    VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...

  8. 【转】 linux内存管理

    一 为什么需要使用虚拟内存 大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多.问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕.所以提出了虚拟内存,使得 ...

  9. linux下使用yum安装Apache+php+Mysql+phpMyAdmin

    适用redhat于32位及64位,前提架设好本地源.在这里不再赘述. 1 安装Apache+php+Mysql a.安装Apahce, PHP, Mysql, 以及php连接mysql库组件 yum ...

  10. angular遇到问题

    一.一个js中只有一个angunlar.module,但可以有多个controller,从而控制多个不同的作用域,每个作用域都有独立的$scope.不同作用域之间又有$rootScope这个桥梁 二. ...