zoukankan      html  css  js  c++  java
  • poj1113Wall(凸包)

    链接

    顺便整理出来一份自己看着比较顺眼的模板

      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 1010
     12 #define LL long long
     13 #define INF 0xfffffff
     14 const double eps = 1e-8;
     15 const double pi = 3.141592653;
     16 const double inf = ~0u>>2;
     17 struct Point
     18 {
     19     double x,y;
     20     Point(double x=0,double y=0):x(x),y(y) {} //构造函数 方便代码编写
     21 }p[N],ch[N];
     22 typedef Point pointt;
     23 pointt operator + (Point a,Point b)
     24 {
     25     return Point(a.x+b.x,a.y+b.y);
     26 }
     27 pointt operator - (Point a,Point b)
     28 {
     29     return Point(a.x-b.x,a.y-b.y);
     30 }
     31 pointt operator * (Point a,double b)
     32 {
     33     return Point(a.x*b,a.y*b);
     34 }
     35 pointt operator / (Point a,double b)
     36 {
     37     return Point(a.x/b,a.y/b);
     38 }
     39 bool operator < (const Point &a,const Point &b)
     40 {
     41     return a.x<b.x||(a.x==b.x&&a.y<b.y);
     42 }
     43 int dcmp(double x)
     44 {
     45     if(fabs(x)<eps) return 0;
     46     else return x<0?-1:1;
     47 }
     48 bool operator == (const Point &a,const Point &b)
     49 {
     50     return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
     51 }
     52 //求点积以及利用点积求长度和夹角的函数
     53 double dot(Point a,Point b)
     54 {
     55     return a.x*b.x+a.y*b.y;
     56 }
     57 //叉积及叉积求面积
     58 double cross(Point a,Point b)
     59 {
     60     return a.x*b.y-a.y*b.x;
     61 }
     62 double  dis(Point a)
     63 {
     64     return sqrt(dot(a,a));
     65 }
     66 double mul(Point p0,Point p1,Point p2)
     67 {
     68     return cross(p1-p0,p2-p0);
     69 }
     70 bool cmp(Point a,Point b)
     71 {
     72     if(dcmp(mul(p[1],a,b))==0)
     73         return dis(a-p[1])<dis(b-p[1]);
     74     else
     75         return dcmp(mul(p[1],a,b))>0;
     76 }
     77 int Graham(int n)
     78 {
     79     int i,k = 1,top = 1;
     80     Point tmp;
     81     if(n<=3)
     82     {
     83         for(i = 1; i <= 3 ; i++)
     84             ch[i] = p[i];
     85         return n+1;
     86     }
     87     for(i = 1 ; i <= n; i++)
     88     {
     89         if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))
     90             k = i;
     91     }
     92     if(k!=1)
     93     {
     94         tmp = p[1];  p[1] = p[k];  p[k] = tmp;
     95     }
     96     sort(p+2,p+n+1,cmp);
     97     ch[top++] = p[1];
     98     ch[top++] = p[2];
     99     ch[top++] = p[3];
    100     for(i = 4; i <= n ;)
    101     {
    102         if(top<3||mul(ch[top-2],ch[top-1],p[i])>0)
    103         {
    104             ch[top++] = p[i++];
    105         }
    106         else  top--;
    107     }
    108     return top;
    109 }
    110 int main()
    111 {
    112     int i,n,r;
    113     while(scanf("%d%d",&n,&r)!=EOF)
    114     {
    115         for(i = 1 ; i <= n ; i++)
    116         {
    117             scanf("%lf%lf",&p[i].x,&p[i].y);
    118         }
    119         int top = Graham(n);
    120         ch[top] = p[1];
    121         double ma;
    122         ma = 2*pi*r;
    123         for(i = 1 ; i < top ; i++)
    124         {
    125             ma += dis(ch[i]-ch[i+1]);
    126         }
    127         printf("%.0f
    ",ma);
    128     }
    129     return 0;
    130 }
    View Code
  • 相关阅读:
    i++ ++i i=i+1 和i+=1
    cmd命令行 端口
    WAS 查看服务状态
    Linux 拷贝
    jar 压缩 解压 war包
    数据结构
    jar包生成exe可执行程序
    03-vant的一些事
    01-watch原理/computed原理
    05-问题集合
  • 原文地址:https://www.cnblogs.com/shangyu/p/3808151.html
Copyright © 2011-2022 走看看