• 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
    ", 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
    ", kase, ans);
    84     }
    85 
    86     return 0;
    87 }
    代码君
  • 相关阅读:
    顺序表(线性表)操作的思想及实现之C#版
    基于CXF Java 搭建Web Service
    敏捷方法 – 灵活,可靠的软件 使用设计模式和敏捷开发
    使用HttpHanlder处理404: File not found
    关于js模块加载的尝试
    Tfs 自动部署 部署图
    jQuery能做到,PHP能做到,C#也能做到
    优化反射性能的总结(下)
    推荐系统
    10个前端开发必备的工具或使用方法
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4328456.html
Copyright © 2020-2023  润新知