一遇到数学题和计算几何题我就要调半天……

玛雅,我真是太弱了……

基本思路很简单,先上凸包,然后矩形与凸包一边重合,然后旋转卡壳即可

然而我没怎么写过计算几何题,一开始写的各种囧,后来看了hzwer的写法才写得正常一些

一开始写囧,是找矩形的左右边界,用勾股定理算的,囧得不行;

后来发现可以用点积来判断,点积的几何意义:向量A在向量B上投影的长度*向量B的长度

然后就很好做了

 const eps=1e-8;
 type point=record
        x,y:double;
      end;

 ..] of point;
     q:..] of longint;
     p:..] of point;
     n,f1,f2,h,r,t,k,i:longint;
     tmp,ans,d,l,l1,l2:double;

 procedure swap(var a,b:point);
   var c:point;
   begin
     c:=a;
     a:=b;
     b:=c;
   end;

 function cmp(a,b:point):boolean;
   begin
     if abs(a.y-b.y)<eps then exit(a.x<b.x);
     exit(a.y<b.y);
   end;

 function cross(i,j,k,p:longint):double;
   begin
     exit((a[i].x-a[j].x)*(a[k].y-a[p].y)-(a[i].y-a[j].y)*(a[k].x-a[p].x));
   end;

 procedure sort(l,r:longint);
   var i,j:longint;
       x:point;
   begin
     i:=l;
     j:=r;
     x:=a[(l+r) shr ];
     repeat
       while cmp(a[i],x) do inc(i);
       while cmp(x,a[j]) do dec(j);
       if not(i>j) then
       begin
         swap(a[i],a[j]);
         inc(i);
         dec(j);
       end;
     until i>j;
     if l<j then sort(l,j);
     if i<r then sort(i,r);
   end;

 function dis(a,b:point):double;
   begin
     exit(sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)));
   end;

 function mul(i,j,p,q:longint):double;
   begin
     exit((a[i].x-a[j].x)*(a[p].x-a[q].x)+(a[i].y-a[j].y)*(a[p].y-a[q].y));
   end;

 begin
   readln(n);
    to n do
     readln(a[i].x,a[i].y);
   sort(,n);
   ans:=1e15;
   t:=;
   q[]:=;
    to n do
   begin
     ) ],i,q[t-])<eps) do dec(t);
     inc(t);
     q[t]:=i;
   end;
   k:=t;
     do
   begin
     ],i,q[t-])<eps) do dec(t);
     inc(t);
     q[t]:=i;
   end;
 //  q[t+]:=q[];
 {  for i:=1 to t do
     writeln(a[q[i]].x,' ',a[q[i]].y);
   writeln(k); }
   k:=;
   h:=;
   r:=;
     do
   begin
     d:=dis(a[q[i]],a[q[i+]]);
     ],q[i],q[k ],q[i])-cross(q[i+],q[i],q[k],q[i])>-eps ;
     ],q[i],q[r ],q[i])-mul(q[i+],q[i],q[r],q[i])>-eps) ;
      then h:=r;
     ],q[i],q[h ],q[i])-mul(q[i+],q[i],q[h],q[i])<eps) ;
     l1:=mul(q[i+],q[i],q[h],q[i])/d;
     l2:=mul(q[i+],q[i],q[r],q[i])/d;
     l:=abs(cross(q[i+],q[i],q[k],q[i]))/d;
     tmp:=(l2-l1)*l;
     if ans>tmp then
     begin
       ans:=tmp;
      // writeln(tmp,' ',a[q[i]].x,' ',a[q[i]].y,' ',l2/d);
       p[].x:=a[q[i]].x+(a[q[i+]].x-a[q[i]].x)*l2/d;
       p[].y:=a[q[i]].y+(a[q[i+]].y-a[q[i]].y)*l2/d;
      // writeln(p[].x,].y);
       p[].x:=p[].x+(a[q[r]].x-p[].x)*l/dis(p[],a[q[r]]);
       p[].y:=p[].y+(a[q[r]].y-p[].y)*l/dis(p[],a[q[r]]);
       p[].x:=p[].x-(p[].x-a[q[i]].x)*(l2-l1)/dis(p[],a[q[i]]);
       p[].y:=p[].y-(p[].y-a[q[i]].y)*(l2-l1)/dis(p[],a[q[i]]);
       p[].x:=p[].x-(p[].x-p[].x);
       p[].y:=p[].y-(p[].y-p[].y);
     end;
   end;
   writeln(ans::);
   h:=;
     do
     if cmp(p[i],p[h]) then h:=i;
     do
     writeln(p[(h+i) ].x::,].y::);
 end.

bzoj1185的更多相关文章

  1. BZOJ1185 : [HNOI2007]最小矩形覆盖

    求出凸包后,矩形的一条边一定与凸包的某条边重合. 枚举每条边,求出离它最远的点和离它最左最右的点,因为那三个点是单调变化的,所以复杂度为$O(n)$. 注意精度. #include<cstdio ...

  2. 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1945  Solve ...

随机推荐

  1. 【CVE-2016-10009】OpenSSH &lt; 7.4 - agent Protocol Arbitrary Library Loading

    粗看了一下,发现这个漏洞还是比较鸡肋的.如果前提条件满足,该漏洞可以在ssh server执行任意指令.不过前提是:1.攻击者可以往受害者磁盘上写文件.

  2. Android之线程池深度剖析

    1.线程池的引入   引入的好处:   1)提升性能.创建和消耗对象费时费CPU资源   2)防止内存过度消耗.控制活动线程的数量,防止并发线程过多.   使用条件:      假设在一台服务器完成一 ...

  3. jQuery-1.9.1源码分析系列(六) 延时对象续——辅助函数jQuery.when

    $.when的说明 描述: 提供一种方法来执行一个或多个对象的回调函数,返回这些对象的延时(Deferred)对象. 说明(结合实例和源码): 如果你不传递任何参数,  jQuery.when()将返 ...

  4. IOS开发基础知识--碎片39

    1:UIWindow知识点 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDict ...

  5. 前端之CSS(一)

    一.什么是CSS CSS是Cascading Style Sheets,层叠样式表,高大上的说法是用来控制网页数据的表现,可以使网页的表现与数据内容分离.通俗来讲,就是用各种盒子的堆叠实现我们想要的H ...

  6. 由项目中一个hash2int函数引发的思考

    hash2int /** * 计算一个字符串的md5折算成int返回 * @param type $str * @return type */ function hash2int($str) { $m ...

  7. MyEclipse在线安装maven插件最新地址

    http://repository.sonatype.org/content/sites/forge-sites/m2e/0.10.0/S/20100209-0800/

  8. 优化IIS7.5支持10万个同时请求windows 2008 R2

    通过对IIS7的配置进行优化,调整IIS7应用池的队列长度,请求数限制,TCPIP连接数等方面,从而使WEB服务器的性能得以提升,保证WEB访问的访问流畅. -

  9. CSS中的三种基本的定位机制

    CSS 定位机制 CSS 有三种基本的定位机制:普通流.浮动和绝对定位. 一.普通流 除非专门指定,否则所有框都在普通流中定位.普通流中元素框的位置由元素在(X)HTML中的位置决定.块级元素从上到下 ...

  10. DropDownList的用法

    DropDownList是一个下拉列表菜单,平时我们也会经常用到,下面就来看看如何绑定值 1>     静态添加,就是说在值都很明确的情况下 ListItem list1 = new ListI ...