poj1113

题意:给定一些点,求围住这些点的墙的长度,强要求与这些点至少距离为R

思路:凸包,然后还要加上一个圆周长(画一下就知道了)

code:

 1 /*
 2   State:Accepted
 3   Time:2013-03-24 20:58:46
 4 */
 5 #include <iostream>
 6 #include <cstdlib>
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <fstream>
10 #include <cmath>
11 #include <algorithm>
12 using namespace std;
13 struct oo{ int x, y; };
14 int n ,L, xt, yt;
15 oo a[1500], q[2000];
16 
17 void init(){
18      scanf("%d%d",&n ,&L);      
19      for (int i = 1; i <= n ; ++i)
20          scanf("%d%d",&a[i].x , &a[i].y); 
21      
22 }
23 
24 bool cmp(const oo a, const oo b){
25      if (a.x <b.x || a.x == b.x && a.y < b.y) return true;
26      return false;
27 }
28 
29 bool cmp1(const oo a , const oo b ){
30      int x1 = a.x - xt;
31      int x2 = b.x - xt;
32      int y1 = a.y - yt;
33      int y2 = b.y - yt;
34      if (x1*y2 > x2*y1) return true;
35      if (x1*y2 == x2*y1 && x1*x1 + y1*y1 < x2*x2 + y2*y2) return true;
36      return false;
37      
38 }
39 
40 void solve(){
41      sort(a+1, a+n+1,cmp);
42      xt = a[1].x;
43      yt = a[1].y;
44      sort(a+2, a+n+1,cmp1);
45      int h = 1, t = 2;
46      q[h] = a[1];
47      q[t] = a[2];
48      int x2 , y2 , x1, y1;
49      for (int i = 3; i <= n ;++i){
50           while (h < t){
51              x1 = a[i].x - q[t - 1].x;
52              y1 = a[i].y - q[t - 1].y;
53              x2 = q[t].x - q[t - 1].x;
54              y2 = q[t].y - q[t - 1].y;
55              if (x1*y2 - x2*y1 >= 0) --t;
56              else break;
57           }
58           q[++t] = a[i];
59      }   
60      
61      double ans = 0 ,dxy;
62      q[++t] = q[1];
63      for (int i = 2; i <= t; ++i){
64          x1 = q[i].x - q[i-1].x;
65          y1 = q[i].y - q[i-1].y;
66          dxy = x1*x1 + y1*y1;
67          ans += pow(dxy, 0.5);
68      }
69      ans += double(3.14159265358979)*L*2;
70      printf("%.0f\n",ans);
71 }
72 
73 int main(){
74      freopen("poj1113.in","r",stdin);
75      freopen("poj1113.out","w",stdout);
76      init();
77      solve();
78      fclose(stdin); fclose(stdout);
79 }
原文地址:https://www.cnblogs.com/yzcstc/p/3015706.html