hdu4987A simple probability problem.(凸包)
多校的最后一场,当时没看懂题意,看题目还以为是概率问题就没深看。
官方题解
对于他说的第一种,考虑长为L的线段 概率为2L/(pi*d), 可以理解,下面的就不知道在说啥了。。
按我初始的想法想要枚举角度,根据凸包的高度差得出概率,不过有一种更简便的方式,就是题解中的求出凸包的周长,这种方式我的理解为,凸包中的一条线段穿过直线的概率就跟上面所说的线段一样2L/(pi*d),不过因为他是个多边形,有进就肯定有出,所以穿过一条线段就相当于穿过两条,整体来说就是/2...不知道这种理解方式对不对
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 111 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 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 point operator -(point a,point b) 24 { 25 return point(a.x-b.x,a.y-b.y); 26 } 27 double cross(point a,point b) 28 { 29 return a.x*b.y-a.y*b.x; 30 } 31 int dcmp(double x) 32 { 33 if(fabs(x)<eps) return 0; 34 else return x<0?-1:1; 35 } 36 double mul(point p0,point p1,point p2) 37 { 38 return cross(p1-p0,p2-p0); 39 } 40 double dis(point a) 41 { 42 return sqrt(a.x*a.x+a.y*a.y); 43 } 44 bool cmp(point a,point b) 45 { 46 if(dcmp(mul(p[0],a,b))==0) 47 return dis(a-p[0])<dis(b-p[0]); 48 else 49 return dcmp(mul(p[0],a,b))>0; 50 } 51 int Graham(int n) 52 { 53 int i,k = 0,top; 54 point tmp; 55 for(i = 0 ; i < n; i++) 56 { 57 if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x)) 58 k = i; 59 } 60 if(k!=0) 61 { 62 tmp = p[0]; 63 p[0] = p[k]; 64 p[k] = tmp; 65 } 66 sort(p+1,p+n,cmp); 67 ch[0] = p[0]; 68 ch[1] = p[1]; 69 top = 1; 70 for(i = 2; i < n ; i++) 71 { 72 while(top>0&&dcmp(mul(ch[top-1],ch[top],p[i]))<0) 73 top--; 74 top++; 75 ch[top] = p[i]; 76 } 77 return top; 78 } 79 80 int main() 81 { 82 int t,i,n,d; 83 int kk =0 ; 84 cin>>t; 85 while(t--) 86 { 87 scanf("%d%d",&n,&d); 88 for(i =0 ; i < n; i++) 89 scanf("%lf%lf",&p[i].x,&p[i].y); 90 int m = Graham(n); 91 ch[m+1] = ch[0]; 92 double ans =0 ; 93 for(i = 0 ; i <= m ; i++) 94 ans += dis(ch[i]-ch[i+1]); 95 printf("Case #%d: %.4f\n",++kk,ans/(pi*d)); 96 } 97 return 0; 98 }