• hdu3847Trash Removal(凸包)


    链接

    这题居然是WF的题, 应属于签到题。。

    求一个多边形是否能被一个宽为d的矩形框住。

    可以求一下凸包,然后枚举每条凸包的边,找出距离最远的点。

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stdlib.h>
      6 #include<vector>
      7 #include<cmath>
      8 #include<queue>
      9 #include<set>
     10 using namespace std;
     11 #define N 100000
     12 #define LL long long
     13 #define INF 0xfffffff
     14 const double eps = 1e-8;
     15 const double pi = acos(-1.0);
     16 const double inf = ~0u>>2;
     17 const int MAXN=1550;
     18 struct point
     19 {
     20     double x,y;
     21     point(double x=0,double y=0):x(x),y(y){}
     22 }p[N],ch[N];
     23 typedef point pointt;
     24 point operator -(point a,point b)
     25 {
     26     return point(a.x-b.x,a.y-b.y);
     27 }
     28 int dcmp(double x)
     29 {
     30     if(fabs(x)<eps) return 0;
     31     return x<0?-1:1;
     32 }
     33 double dis(point a,point b)
     34 {
     35     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
     36 }
     37 double cross(point a,point b)
     38 {
     39     return a.x*b.y-a.y*b.x;
     40 }
     41 double mul(point p0,point p1,point p2)
     42 {
     43     return cross(p1-p0,p2-p0);
     44 }
     45 double dis(point a)
     46 {
     47     return sqrt(a.x*a.x+a.y*a.y);
     48 }
     49 bool cmp(point a,point b)
     50 {
     51     if(dcmp(mul(p[0],a,b))==0)
     52         return dis(a-p[0])<dis(b-p[0]);
     53     else
     54         return dcmp(mul(p[0],a,b))>0;
     55 }
     56 int Graham(int n)
     57 {
     58     int i,k = 0,top;
     59     point tmp;
     60     for(i = 0 ; i < n; i++)
     61     {
     62         if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))
     63             k = i;
     64     }
     65     if(k!=0)
     66     {
     67         tmp = p[0];
     68         p[0] = p[k];
     69         p[k] = tmp;
     70     }
     71     sort(p+1,p+n,cmp);
     72     ch[0] = p[0];
     73     ch[1] = p[1];
     74     top = 1;
     75     for(i = 2; i < n ; i++)
     76     {
     77         while(top>0&&dcmp(mul(ch[top-1],ch[top],p[i]))<0)
     78             top--;
     79         top++;
     80         ch[top] = p[i];
     81     }
     82     return top;
     83 }
     84 double distancetoline(point p,point a,point b)
     85 {
     86     point v1 = b-a,v2 = p-a;
     87     return fabs(cross(v1,v2))/dis(v1);
     88 }
     89 int main()
     90 {
     91     int i,j;
     92     int n,kk=0;
     93     while(scanf("%d",&n)&&n)
     94     {
     95         for(i = 0 ; i < n; i++)
     96         scanf("%lf%lf",&p[i].x,&p[i].y);
     97         int m = Graham(n);
     98         ch[m+1] = ch[0];
     99         double ans = INF;
    100         for(i = 0 ; i <= m; i++)
    101         {
    102             double ts = 0;
    103             for(j = 0 ; j <= m ; j++)
    104             ts = max(ts,distancetoline(ch[j],ch[i],ch[i+1]));
    105             ans = min(ans,ts);
    106         }
    107         ans = ceil(ans*100)/100;
    108         printf("Case %d: %.2lf
    ",++kk,ans);
    109     }
    110     return 0;
    111 }
    View Code
  • 相关阅读:
    xcode8.3 shell 自动打包脚本
    MarkDown常用语法记录
    正则表达式matcher.group()用法
    使用Jenkins进行持续集成
    Java8新特性:Stream的使用
    zookeeper windows 下配置和基础命令
    JAVA文件中获取路径及WEB应用程序获取路径方法
    共享锁(S锁)和排它锁(X锁)
    zookeeper 官方文档——综述
    zookeeper 入门指导
  • 原文地址:https://www.cnblogs.com/shangyu/p/3947728.html
Copyright © 2020-2023  润新知