HDU4978概率几何

来源:互联网 发布:350淘宝模板破解 编辑:程序博客网 时间:2024/06/04 20:12

题目意思不是很清楚,看着人家的题解试着做,当练代码吧。

由概率论书上什么抛针问题(我也不懂)可知一条长度为L的线段与间距为D的平行线相交的概率为2L / πD,由此我们可知凸包上一条线段Li与间距为D的平行线相交的概率为2Li / πD,又因为凸包上如果有一条线段与平行线相交则必定存在另一条线段Lj与Li同时与平行线相交(凸包是封闭凸多边形),那么2Li / πD = ∑Pij(Pij表示Li与Lj同时与平行线相交的概率,同时i!=j),则凸包与平行线相交的概率为1 / 2 * sum{ sum{ Pij | i != j } | 1 <= i <= n },除以2的原因是Pij与Pji是等价的,是同时满足的。

那么问题最后就转化成了求凸包的周长了。


#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<vector>#include<queue>#include<stack>#define rt return#define sf scanf#define pf printf#define si(n) sf("%d",&n)#define REP0(i,n) for(int i=0;i<(n);i++)#define REP1(i,n) for(int i=1;i<=(n);i++)#define REP(i,s,n) for(int i=s;i<=(n);i++)#define db double#define LL long long#define op operator#define INF 0x3fffffff#define eps 1e-8#define PI acos(-1)#define maxn 1010using namespace std;struct node{    db x,y;    node(){}    node(db a,db b){x=a,y=b;}    void in(){sf("%lf%lf",&x,&y);}    void out(){pf("%lf %lf\n",x,y);}    node op + (node a) {rt node(x+a.x,y+a.y);}    node op - (node a) {rt node(x-a.x,y-a.y);}    db op * (node a) {rt x*a.x+y*a.y;}    db op ^ (node a) {rt x*a.y-a.x*y;}    db dis(){rt sqrt(x*x+y*y); }    db dis(node a) {rt sqrt((x-a.x)*(x-a.x)+(y-a.y)*(y-a.y));}    bool op <(node& a) {return y<a.y||(y==a.y&&x<a.x);}    db cross(node a,node b) {return (a-*this)^(b-*this);}    bool on_seg(node a,node b){        return ((a-*this)^(b-*this))==0 && ((a-*this)*(b-*this))<=0 ;}}p[maxn],s[maxn];int n;bool cmp(node a,node b){    db res=(a-p[0])^(b-p[0]);    rt res>0;}int sig(db x){rt (x>eps)-(x<-eps); }int convex(){    sort(p+1,p+n,cmp);    int top=-1;    s[++top]=p[0];    for(int i=1;i<n;i++){        while(top>1&&sig((p[i]-s[top-1])^(s[top]-s[top-1]))>0)top--;        s[++top]=p[i];    }    s[++top]=p[0];    rt top;}int main(){    #ifdef ACBang    freopen("in.txt","r",stdin);    #endif    int T;si(T);    int CASE=1;    while(T--){        db D;        sf("%d%lf",&n,&D);        p[0].in();        for(int i=1;i<n;i++){            p[i].in();            if(p[i]<p[0])swap(p[i],p[0]);        }        int top=convex();//包含起点且为末尾的坐标        db L=0;        for(int i=0;i<top;i++)L+=(s[i]-s[i+1]).dis();//        pf("%lf\n",L);        pf("Case #%d: %.4lf\n",CASE++,L/PI/D);    }    rt 0;}


0 0
原创粉丝点击