前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Uva_11722 Joining with Friend

Uva_11722 Joining with Friend

作者头像
若羽
发布2019-07-15 16:21:59
3320
发布2019-07-15 16:21:59
举报
文章被收录于专栏:Code思维奇妙屋Code思维奇妙屋

题目链接

题意:

  两个人坐火车, 在某个城市到站的时间段分别为[t1, t2] , [s1, s2],停在站台的时间均为w。

  问, 若两人能见面的概率。

思路:

  一道基础的几何概型, p = s(m)/s(n)。

  令x1 = t1, x2 = t2。

  令y1 = s1, y2 = s2。

  这样这四条直线就围成一个矩形,若两人见面, 则应该满足在 y = x ± w 这两条直线之间。

  即本题求解, y = x ± w 在矩形中所围面积 与矩形面积之比。

  根据 y = x + b 这条线与矩形的交点不同, 把矩形分成四个区域, 计算面积这里规定以左上角的点为参考点计算。

  阴影面积即为所求

  1)

  2)

  这种情况将之补成一个三角形, 用大三角形减去小三角形的面积即可。

  3)

  这种情况, 用矩形面积减去小三角形面积即可。

  4)

  这种情况也用补全三角形来求解

  other)

  如果直线相交于左上角, 那么面积为0. 如果在右下角, 那么面积为矩形面积。

代码如下:

代码语言:javascript
复制
 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <ctime>
 6 #include <climits>
 7 #include <set>
 8 #include <map>
 9 #include <list>
10 #include <queue>
11 #include <string>
12 #include <vector>
13 #include <fstream>
14 #include <iterator>
15 #include <iostream>
16 #include <algorithm>
17 using namespace std;
18 #define LL long long
19 #define MAXN 4
20 #define MOD 1000000007
21 #define eps 1e-6
22 double s[MAXN], t[MAXN], w;
23 double weight, high;
24 double get_area(double b)
25 {
26     double tx = t[2] - b;
27     double dx = t[1] - b;
28     double ly = s[1] + b;
29     double ry = s[2] + b;
30     //printf("tx: %.7lf, dx: %.7lf, ly: %.7lf, ry: %.7lf\n", tx, dx, ly, ry);
31     bool OnTop = (tx <= s[2] && tx >= s[1]);
32     bool OnDown = (dx <= s[2] && dx >= s[1]);
33     bool OnLeft = (ly <= t[2] && ly >= t[1]);
34     bool OnRight = (ry <= t[2] && ry >= t[1]);
35 
36     if(OnTop && OnLeft)
37         return 0.5 * (tx - s[1]) * (t[2] - ly);
38     if(OnLeft && OnRight)
39         return 0.5 * ((t[2] - ly) * (tx - s[1]) - (t[2] - ry) * (tx - s[2]));
40     if(OnDown && OnTop)
41         return 0.5 * ((tx - s[1]) * (t[2] - ly) - (dx - s[1]) * (t[1] - ly));
42     if(OnDown && OnRight)
43         return weight * high - 0.5 * (s[2] - dx) * (ry - t[1]);
44     return ly >= t[2] ? 0 : weight * high;
45 }
46 
47 int main()
48 {
49     int T;
50     int kcase = 0;
51     scanf("%d", &T);
52     while(T --)
53     {
54         scanf("%lf %lf %lf %lf %lf", &t[1], &t[2], &s[1], &s[2], &w);
55         high = t[2] - t[1];
56         weight = s[2] - s[1];
57         double area_top = get_area(w);
58         double area_down = get_area(-1 * w);
59         double ans = high * weight;
60         //printf("%.8lf %.8lf %.8lf\n", area_top, area_down, ans);
61         ans = (area_down - area_top) / ans;
62         printf("Case #%d: %.8lf\n", ++ kcase, ans);
63     }
64     return 0;
65 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-07-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档