UVa 11722 (概率 数形结合) Joining with Friend

高中也做个这种类似的题目,概率空间是[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 }
代码君

 

posted @ 2015-03-10 21:26  AOQNRMGYXLMV  阅读(295)  评论(0编辑  收藏  举报