UVA11722(见面概率)
生活随笔
收集整理的這篇文章主要介紹了
UVA11722(见面概率)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 有一個車站,兩個人想要在這個車站見面,第一個人會在t1到t2之間的任意一個時刻到(時間上任意一點概率一樣),并且停留w時間,第二個人是s2到s2的時間段到,停留也是w,問兩個人的見面概率是多少?
思路:
? ? ? 這個應該算是個比較經典的問題了吧,感覺在那看到過,我們建立一個直角坐標系,t1<=x<=t2 ,s1<=y<=s2這樣構成的這個矩形就是所有的概率區間,然后畫一條x=y的直線,然后把這個直線沿著x=y方向想下和向上平移w得到一個區間,這個區間和句型重疊的部分就是見面的概率區間,用這個面積除以矩形的面積就是見面概率,求面積的時候我的方法比較笨,y=x+w,y=x-w這兩條直線分別和四條線段求交點,然后在根據得到的四個交點的位置分布,枚舉求出答案,我寫的比較麻煩!
#include<stdio.h>
#include<string.h>
int main ()
{
? ?double t1 ,t2 ,s1 ,s2 ,w ,x ,y;
? ?double x1 ,x11 ,y1 ,y11;
? ?double x2 ,x22 ,y2 ,y22;
? ?int mark1[5] ,mark2[5];
? ?int t ,cas = 1;
? ?scanf("%d" ,&t);
? ?while(t--)
? ?{
? ? ? scanf("%lf %lf %lf %lf %lf" ,&t1 ,&t2 ,&s1 ,&s2 ,&w);
? ? ? int mk = 0;?
? ? ? memset(mark1 ,0 ,sizeof(mark1));
? ? ? memset(mark2 ,0 ,sizeof(mark2));
? ? ? // 1
? ? ? y = t1 + w;
? ? ? if(y >= s1)
? ? ? {
? ? ? ? ?if(y >= s2) y = s2;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x1 = t1 ,y1 = y;
? ? ? ? ?else x11 = t1 ,y11 = y;
? ? ? ? ?mark1[1] = 1;
? ? ? ? ?mk ++;
? ? ? }
? ? ? ?//4
? ? ? x = s1 - w;
? ? ? if(x >= t1)
? ? ? {
? ? ? ? ?mark1[4] = 1;
? ? ? ? ?if(x >= t2) x = t2;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x1 = x ,y1 = s1;
? ? ? ? ?else x11 = x ,y11 = s1;
? ? ? ? ?mk ++;
? ? ? }
? ? ??
? ? ? //3
? ? ? y = t2 + w;
? ? ? if(y <= s2)
? ? ? {
? ? ? ? ?mark1[3] = 1;
? ? ? ? ?if(y < s1) y = s1;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x1 = t2 ,y1 = y;
? ? ? ? ?else x11 = t2 ,y11 = y;
? ? ? ? ?mk ++;
? ? ? }
? ? ? //2
? ? ? x = s2 - w;
? ? ? if(x <= t2)
? ? ? {
? ? ? ? ?mark1[2] = 1;
? ? ? ? ?if(x < t1) x = t1;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x1 = x ,y1 = s2;
? ? ? ? ?else x11 = x ,y11 = s2;
? ? ? ? ?mk ++;
? ? ? }
? ? ?
? ? ??
? ? ??
? ? ? mk = 0;?
? ? ? // 1
? ? ? y = t1 - w;
? ? ? if(y >= s1)
? ? ? {
? ? ? ? ?mark2[1] = 1;
? ? ? ? ?if(y >= s2) y = s2;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x2 = t1 ,y2 = y;
? ? ? ? ?else x22 = t1 ,y22 = y;
? ? ? ? ?mk ++;
? ? ? }
? ? ??
? ? ? //4
? ? ? x = s1 + w;
? ? ? if(x >= t1)
? ? ? {
? ? ? ? ?mark2[4] = 1;
? ? ? ? ?if(x >= t2) x = t2;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x2 = x ,y2 = s1;
? ? ? ? ?else x22 = x ,y22 = s1;
? ? ? ? ?mk ++;
? ? ? }
? ? ? //3
? ? ? y = t2 - w;
? ? ? if(y <= s2)
? ? ? {
? ? ? ? ?mark2[3] = 1;
? ? ? ? ?if(y < s1) y = s1;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x2 = t2 ,y2 = y;
? ? ? ? ?else x22 = t2 ,y22 = y;
? ? ? ? ?mk ++;
? ? ? }
? ? ? //2
? ? ? x = s2 + w;
? ? ? if(x <= t2 )
? ? ? {
? ? ? ? ?mark2[2] = 1;
? ? ? ? ?if(x < t1) x = t1;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x2 = x ,y2 = s2;
? ? ? ? ?else x22 = x ,y22 = s2;
? ? ? ? ?mk ++;
? ? ? }
? ? ??
? ? ??
? ? ? if(x1 == x11 && y1 == y11 && x2 == x22 && y2 == y22 && x1 ==x2 && y1 == y2)
? ? ? {
? ? ? ? ?printf("Case #%d: 0.00000000" ,cas ++);
? ? ? ? ?continue;
? ? ? }
? ? ? double m1 ,m2;
? ? ? double m = (t2 - t1) * (s2 - s1);
? ? ? if(mark1[1] && mark1[2]) m1 = (s2 - y1) * (x11 - t1) / 2;
? ? ? else if(mark1[1] && mark1[3]) m1 = ((s2 - y1) + (s2 - y11)) * (t2 - t1) / 2;
? ? ? else if(mark1[4] && mark1[2]) m1 = ((x1 - t1) + (x11 - t1)) * (s2 - s1) / 2;
? ? ? else if(mark1[4] && mark1[3]) m1 = m - ?(y11 - s1) * (t2 - x1) / 2;
? ? ??
? ? ? if(mark2[1] && mark2[2]) m2 = ?m - (s2 - y2) * (x22 - t1) / 2;
? ? ? else if(mark2[1] && mark2[3]) m2 = m - ((s2 - y2) + (s2 - y22)) * (t2 - t1) / 2;
? ? ? else if(mark2[4] && mark2[2]) m2 = m - ((x2 - t1) + (x22 - t1)) * (s2 - s1) / 2;
? ? ? else if(mark2[4] && mark2[3]) m2 = (y22 - s1) * (t2 - x2) / 2;
? ? ??
? ? ? double Ans = (m - (m1 + m2)) / m;
? ? ? printf("Case #%d: %.8lf\n" ,cas ++ ,Ans);
? ? ??
? ?}
? ?return 0;
}
? ? ??
? ? ? ? ?
? ? ??
? ? ??
? ? ? ? ?
? ? ??
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ??
? ? ??
? ? ??
? ? ? 有一個車站,兩個人想要在這個車站見面,第一個人會在t1到t2之間的任意一個時刻到(時間上任意一點概率一樣),并且停留w時間,第二個人是s2到s2的時間段到,停留也是w,問兩個人的見面概率是多少?
思路:
? ? ? 這個應該算是個比較經典的問題了吧,感覺在那看到過,我們建立一個直角坐標系,t1<=x<=t2 ,s1<=y<=s2這樣構成的這個矩形就是所有的概率區間,然后畫一條x=y的直線,然后把這個直線沿著x=y方向想下和向上平移w得到一個區間,這個區間和句型重疊的部分就是見面的概率區間,用這個面積除以矩形的面積就是見面概率,求面積的時候我的方法比較笨,y=x+w,y=x-w這兩條直線分別和四條線段求交點,然后在根據得到的四個交點的位置分布,枚舉求出答案,我寫的比較麻煩!
#include<stdio.h>
#include<string.h>
int main ()
{
? ?double t1 ,t2 ,s1 ,s2 ,w ,x ,y;
? ?double x1 ,x11 ,y1 ,y11;
? ?double x2 ,x22 ,y2 ,y22;
? ?int mark1[5] ,mark2[5];
? ?int t ,cas = 1;
? ?scanf("%d" ,&t);
? ?while(t--)
? ?{
? ? ? scanf("%lf %lf %lf %lf %lf" ,&t1 ,&t2 ,&s1 ,&s2 ,&w);
? ? ? int mk = 0;?
? ? ? memset(mark1 ,0 ,sizeof(mark1));
? ? ? memset(mark2 ,0 ,sizeof(mark2));
? ? ? // 1
? ? ? y = t1 + w;
? ? ? if(y >= s1)
? ? ? {
? ? ? ? ?if(y >= s2) y = s2;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x1 = t1 ,y1 = y;
? ? ? ? ?else x11 = t1 ,y11 = y;
? ? ? ? ?mark1[1] = 1;
? ? ? ? ?mk ++;
? ? ? }
? ? ? ?//4
? ? ? x = s1 - w;
? ? ? if(x >= t1)
? ? ? {
? ? ? ? ?mark1[4] = 1;
? ? ? ? ?if(x >= t2) x = t2;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x1 = x ,y1 = s1;
? ? ? ? ?else x11 = x ,y11 = s1;
? ? ? ? ?mk ++;
? ? ? }
? ? ??
? ? ? //3
? ? ? y = t2 + w;
? ? ? if(y <= s2)
? ? ? {
? ? ? ? ?mark1[3] = 1;
? ? ? ? ?if(y < s1) y = s1;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x1 = t2 ,y1 = y;
? ? ? ? ?else x11 = t2 ,y11 = y;
? ? ? ? ?mk ++;
? ? ? }
? ? ? //2
? ? ? x = s2 - w;
? ? ? if(x <= t2)
? ? ? {
? ? ? ? ?mark1[2] = 1;
? ? ? ? ?if(x < t1) x = t1;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x1 = x ,y1 = s2;
? ? ? ? ?else x11 = x ,y11 = s2;
? ? ? ? ?mk ++;
? ? ? }
? ? ?
? ? ??
? ? ??
? ? ? mk = 0;?
? ? ? // 1
? ? ? y = t1 - w;
? ? ? if(y >= s1)
? ? ? {
? ? ? ? ?mark2[1] = 1;
? ? ? ? ?if(y >= s2) y = s2;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x2 = t1 ,y2 = y;
? ? ? ? ?else x22 = t1 ,y22 = y;
? ? ? ? ?mk ++;
? ? ? }
? ? ??
? ? ? //4
? ? ? x = s1 + w;
? ? ? if(x >= t1)
? ? ? {
? ? ? ? ?mark2[4] = 1;
? ? ? ? ?if(x >= t2) x = t2;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x2 = x ,y2 = s1;
? ? ? ? ?else x22 = x ,y22 = s1;
? ? ? ? ?mk ++;
? ? ? }
? ? ? //3
? ? ? y = t2 - w;
? ? ? if(y <= s2)
? ? ? {
? ? ? ? ?mark2[3] = 1;
? ? ? ? ?if(y < s1) y = s1;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x2 = t2 ,y2 = y;
? ? ? ? ?else x22 = t2 ,y22 = y;
? ? ? ? ?mk ++;
? ? ? }
? ? ? //2
? ? ? x = s2 + w;
? ? ? if(x <= t2 )
? ? ? {
? ? ? ? ?mark2[2] = 1;
? ? ? ? ?if(x < t1) x = t1;
? ? ? ? ?if(mk <= 2)
? ? ? ? ?if(mk == 0) x2 = x ,y2 = s2;
? ? ? ? ?else x22 = x ,y22 = s2;
? ? ? ? ?mk ++;
? ? ? }
? ? ??
? ? ??
? ? ? if(x1 == x11 && y1 == y11 && x2 == x22 && y2 == y22 && x1 ==x2 && y1 == y2)
? ? ? {
? ? ? ? ?printf("Case #%d: 0.00000000" ,cas ++);
? ? ? ? ?continue;
? ? ? }
? ? ? double m1 ,m2;
? ? ? double m = (t2 - t1) * (s2 - s1);
? ? ? if(mark1[1] && mark1[2]) m1 = (s2 - y1) * (x11 - t1) / 2;
? ? ? else if(mark1[1] && mark1[3]) m1 = ((s2 - y1) + (s2 - y11)) * (t2 - t1) / 2;
? ? ? else if(mark1[4] && mark1[2]) m1 = ((x1 - t1) + (x11 - t1)) * (s2 - s1) / 2;
? ? ? else if(mark1[4] && mark1[3]) m1 = m - ?(y11 - s1) * (t2 - x1) / 2;
? ? ??
? ? ? if(mark2[1] && mark2[2]) m2 = ?m - (s2 - y2) * (x22 - t1) / 2;
? ? ? else if(mark2[1] && mark2[3]) m2 = m - ((s2 - y2) + (s2 - y22)) * (t2 - t1) / 2;
? ? ? else if(mark2[4] && mark2[2]) m2 = m - ((x2 - t1) + (x22 - t1)) * (s2 - s1) / 2;
? ? ? else if(mark2[4] && mark2[3]) m2 = (y22 - s1) * (t2 - x2) / 2;
? ? ??
? ? ? double Ans = (m - (m1 + m2)) / m;
? ? ? printf("Case #%d: %.8lf\n" ,cas ++ ,Ans);
? ? ??
? ?}
? ?return 0;
}
? ? ??
? ? ? ? ?
? ? ??
? ? ??
? ? ? ? ?
? ? ??
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ? ? ?
? ? ??
? ? ??
? ? ??
總結
以上是生活随笔為你收集整理的UVA11722(见面概率)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA11549计算器谜题
- 下一篇: LA3942字典树+递推