高中也做个这种类似的题目,概率空间是[t1, t2] × [s1, s2]的矩形,设x、y分别代表两辆列车到达的时间,则两人相遇的条件就是|x - y| <= w

从图形上看就是矩形夹在两条平行线之间的部分。

因为情况众多,一个一个分类很麻烦,而且可能有漏掉情况,所以就用计算几何的办法求了个凸多边形,多边形 与 矩形面积之比就是概率。

代码有点挫,将就看,=_=||

 #include <cstdio>
#include <vector>
#include <cmath>
using namespace std; struct Point
{
double x, y;
Point(double x=, double y=):x(x), y(y) {}
};
typedef Point Vector;
typedef vector<Point> Polygon; Point operator + (const Point& A, const Point& B)
{ return Point(A.x+B.x, A.y+B.y); } Vector operator - (const Point& A, const Point& B)
{ return Point(A.x-B.x, A.y-B.y); } Vector operator * (const Vector& A, double p)
{ return Vector(A.x*p, A.y*p); } double Cross(const Vector& A, const Vector& B)
{ return A.x * B.y - A.y * B.x; } double PolygonArea(const Polygon& p)
{//求多边形面积
int n = p.size();
double area = ;
for(int i = ; i < n-; i++)
area += Cross(p[i]-p[], p[i+]-p[]);
return area/;
} Point Intersection(Point P, Vector v, Point Q, Vector w)
{//求两直线交点
Vector u = P-Q;
double t = Cross(w, u) / Cross(v, w);
return P+v*t;
} const double sqrt2 = sqrt(2.0);
const Vector v1(, ), v2(, ), v3(, );
double t1, t2, s1, s2, w;
Polygon poly; bool in(const Point& p)
{ return p.x >= t1 && p.x <= t2 && p.y >= s1 && p.y <= s2; } void check(Point p)
{
if(in(p) && fabs(p.x-p.y) <= w)//该点要在矩形内两平行线之间
poly.push_back(Point(p.x, p.y));
} int main()
{
//freopen("in.txt", "r", stdin); int T;
scanf("%d", &T);
for(int kase = ; kase <= T; kase++)
{
poly.clear();
scanf("%lf%lf%lf%lf%lf", &t1, &t2, &s1, &s2, &w);
Point p(t1, s2), p1(, w), p2(, -w);
check(p);
p = Intersection(Point(t1, ), v2, p1, v3); check(p);
p = Intersection(Point(t1, ), v2, p2, v3); check(p);
p = Point(t1, s1); check(p);
p = Intersection(Point(, s1), v1, p1, v3); check(p);
p = Intersection(Point(, s1), v1, p2, v3); check(p);
p = Point(t2, s1); check(p);
p = Intersection(Point(t2, ), v2, p2, v3); check(p);
p = Intersection(Point(t2, ), v2, p1, v3); check(p);
p = Point(t2, s2); check(p);
p = Intersection(Point(, s2), v1, p2, v3); check(p);
p = Intersection(Point(, s2), v1, p1, v3); check(p);
//for(int i = 0; i < poly.size(); i++) printf("%.3f %.3f\n", poly[i].x, poly[i].y);
double A = PolygonArea(poly);
double B = (t2-t1) * (s2-s1);
double ans = A / B;
printf("Case #%d: %.8f\n", kase, ans);
} return ;
}

代码君

最新文章

  1. 取两个String数组的交集
  2. oracle连接方式、创建数据库用户、忘记数据库密码、用户锁定
  3. ExtJS4笔记 Data
  4. CSS网页中的相对定位与绝对定位
  5. HDU-4336 Card Collector 概率DP
  6. 网页中获取网络mp3文件的时常
  7. php实现分页,上一页下一页
  8. SIX GOD
  9. sqlserver数据库类型对应Java中的数据类型
  10. 转载 感受K2.Net 2003工作流解决方案
  11. js冒泡排序,数组去重
  12. Java web开发,在一个jsp里放太多java代码的后果,摘自 java web轻量级开发面试教程
  13. [ExtJS5学习笔记]第二十五节 利用window.open()函数实现ExtJS5的登陆页面跳转
  14. node01
  15. 微服务化的大坑之一:当dubbo神器碰上共用注册中心和错误的暴露接口
  16. 数据库之mysql篇(5)—— 【转载】mysql练习题
  17. idea 关闭代码自动折叠,形参提示,行数栏图标,启动不默认打开上次的项目
  18. C++ STL 学习
  19. python for
  20. vsCode_1.27.2

热门文章

  1. Fixing:insert_modules not found
  2. JSP访问Spring中的bean
  3. PV操作,
  4. 数组对象Vector用法
  5. java基础知识回顾之java Socket学习(二)--TCP协议编程
  6. C# 构造函数的使用方法
  7. CKeditor 配置使用
  8. CF 353C Find Maximum #205 (Div. 2)
  9. 什么是struts2?
  10. MIT算法导论——第一讲.Analysis of algorithm