题目意思不是很清楚,看着人家的题解试着做,当练代码吧。
由概率论书上什么抛针问题(我也不懂)可知一条长度为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 1010
using 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;
}