高中也做个这种类似的题目,概率空间是[t1, t2] × [s1, s2]的矩形,设x、y分别代表两辆列车到达的时间,则两人相遇的条件就是|x - y| <= w
从图形上看就是矩形夹在两条平行线之间的部分。
因为情况众多,一个一个分类很麻烦,而且可能有漏掉情况,所以就用计算几何的办法求了个凸多边形,多边形 与 矩形面积之比就是概率。
代码有点挫,将就看,=_=||
1 #include <cstdio> 2 #include <vector> 3 #include <cmath> 4 using namespace std; 5 6 struct Point 7 { 8 double x, y; 9 Point(double x=0, double y=0):x(x), y(y) {} 10 }; 11 typedef Point Vector; 12 typedef vector<Point> Polygon; 13 14 Point operator + (const Point& A, const Point& B) 15 { return Point(A.x+B.x, A.y+B.y); } 16 17 Vector operator - (const Point& A, const Point& B) 18 { return Point(A.x-B.x, A.y-B.y); } 19 20 Vector operator * (const Vector& A, double p) 21 { return Vector(A.x*p, A.y*p); } 22 23 double Cross(const Vector& A, const Vector& B) 24 { return A.x * B.y - A.y * B.x; } 25 26 double PolygonArea(const Polygon& p) 27 {//求多边形面积 28 int n = p.size(); 29 double area = 0; 30 for(int i = 1; i < n-1; i++) 31 area += Cross(p[i]-p[0], p[i+1]-p[0]); 32 return area/2; 33 } 34 35 Point Intersection(Point P, Vector v, Point Q, Vector w) 36 {//求两直线交点 37 Vector u = P-Q; 38 double t = Cross(w, u) / Cross(v, w); 39 return P+v*t; 40 } 41 42 const double sqrt2 = sqrt(2.0); 43 const Vector v1(1, 0), v2(0, 1), v3(1, 1); 44 double t1, t2, s1, s2, w; 45 Polygon poly; 46 47 bool in(const Point& p) 48 { return p.x >= t1 && p.x <= t2 && p.y >= s1 && p.y <= s2; } 49 50 void check(Point p) 51 { 52 if(in(p) && fabs(p.x-p.y) <= w)//该点要在矩形内两平行线之间 53 poly.push_back(Point(p.x, p.y)); 54 } 55 56 int main() 57 { 58 //freopen("in.txt", "r", stdin); 59 60 int T; 61 scanf("%d", &T); 62 for(int kase = 1; kase <= T; kase++) 63 { 64 poly.clear(); 65 scanf("%lf%lf%lf%lf%lf", &t1, &t2, &s1, &s2, &w); 66 Point p(t1, s2), p1(0, w), p2(0, -w); 67 check(p); 68 p = Intersection(Point(t1, 0), v2, p1, v3); check(p); 69 p = Intersection(Point(t1, 0), v2, p2, v3); check(p); 70 p = Point(t1, s1); check(p); 71 p = Intersection(Point(0, s1), v1, p1, v3); check(p); 72 p = Intersection(Point(0, s1), v1, p2, v3); check(p); 73 p = Point(t2, s1); check(p); 74 p = Intersection(Point(t2, 0), v2, p2, v3); check(p); 75 p = Intersection(Point(t2, 0), v2, p1, v3); check(p); 76 p = Point(t2, s2); check(p); 77 p = Intersection(Point(0, s2), v1, p2, v3); check(p); 78 p = Intersection(Point(0, s2), v1, p1, v3); check(p); 79 //for(int i = 0; i < poly.size(); i++) printf("%.3f %.3f\n", poly[i].x, poly[i].y); 80 double A = PolygonArea(poly); 81 double B = (t2-t1) * (s2-s1); 82 double ans = A / B; 83 printf("Case #%d: %.8f\n", kase, ans); 84 } 85 86 return 0; 87 }