• hdu4987A simple probability problem.(凸包)


    链接

    多校的最后一场,当时没看懂题意,看题目还以为是概率问题就没深看。

    官方题解

    对于他说的第一种,考虑长为L的线段 概率为2L/(pi*d), 可以理解,下面的就不知道在说啥了。。

    按我初始的想法想要枚举角度,根据凸包的高度差得出概率,不过有一种更简便的方式,就是题解中的求出凸包的周长,这种方式我的理解为,凸包中的一条线段穿过直线的概率就跟上面所说的线段一样2L/(pi*d),不过因为他是个多边形,有进就肯定有出,所以穿过一条线段就相当于穿过两条,整体来说就是/2...不知道这种理解方式对不对

     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
    ",++kk,ans/(pi*d));
    96     }
    97     return 0;
    98 }
    View Code
  • 相关阅读:
    洛谷 1443——马的遍历(广度优先搜索)
    jzoj C组 2017.1.21
    jzoj C组 2017.1.20 比赛
    jzoj C组 2017.1.19 比赛
    jzoj C组 2017.1.18 比赛
    jzoj C组 2017.1.17 比赛
    jzoj C组 2017.1.16 比赛
    jzoj C组 2017.1.15比赛
    [LCA][数学]JZOJ 4794 富爷说是一棵树
    [CDQ分治][带权并查集]JZOJ 4769
  • 原文地址:https://www.cnblogs.com/shangyu/p/3930157.html
Copyright © 2020-2023  润新知