E. Runaway to a Shadow

题目连接:

http://www.codeforces.com/contest/681/problem/E

Description

Dima is living in a dormitory, as well as some cockroaches.

At the moment 0 Dima saw a cockroach running on a table and decided to kill it. Dima needs exactly T seconds for aiming, and after that he will precisely strike the cockroach and finish it.

To survive the cockroach has to run into a shadow, cast by round plates standing on the table, in T seconds. Shadow casted by any of the plates has the shape of a circle. Shadow circles may intersect, nest or overlap arbitrarily.

The cockroach uses the following strategy: first he equiprobably picks a direction to run towards and then runs towards it with the constant speed v. If at some moment t ≤ T it reaches any shadow circle, it immediately stops in the shadow and thus will stay alive. Otherwise the cockroach is killed by the Dima's precise strike. Consider that the Dima's precise strike is instant.

Determine the probability of that the cockroach will stay alive.

Input

In the first line of the input the four integers x0, y0, v, T (|x0|, |y0| ≤ 109, 0 ≤ v, T ≤ 109) are given — the cockroach initial position on the table in the Cartesian system at the moment 0, the cockroach's constant speed and the time in seconds Dima needs for aiming respectively.

In the next line the only number n (1 ≤ n ≤ 100 000) is given — the number of shadow circles casted by plates.

In the next n lines shadow circle description is given: the ith of them consists of three integers xi, yi, ri (|xi|, |yi| ≤ 109, 0 ≤ r ≤ 109) — the ith shadow circle on-table position in the Cartesian system and its radius respectively.

Consider that the table is big enough for the cockroach not to run to the table edges and avoid Dima's precise strike.

Output

Print the only real number p — the probability of that the cockroach will stay alive.

Your answer will be considered correct if its absolute or relative error does not exceed 10 - 4.

Sample Input

0 0 1 1

3

1 1 1

-1 -1 1

-2 2 1

Sample Output

0.50000000000

Hint

题意

有一个蟑螂,在x0,y0点,每秒移动,可以移动T秒,T秒后不在阴影中就会被拍死

阴影都是圆,现在给你圆心坐标和圆的半径。

这个蟑螂是随机选择一个方向走的

问你这个蟑螂活下来的概率是多少

题解:

蟑螂和圆都会有一个角度的区间,表示在T秒内能够到达这个阴影中

然后把所有区间拿出来,取并集

然后再除以2pi就好了

思路很简单。

取区间的这个东西,用简单的初中几何知识就能得到。

然后这道题就结束了。

代码

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
const double pi = acos(-1.0);
double sqr(double x)
{
return x*x;
}
double dis(double x,double y,double x1,double y1)
{
return sqrt(sqr(x-x1)+sqr(y-y1));
}
vector<pair<double,int> >a;
double x,y,v,t,r;
int n;
int main()
{ scanf("%lf%lf%lf%lf",&x,&y,&v,&t);
r=v*t;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
double x0,y0,r0;
scanf("%lf%lf%lf",&x0,&y0,&r0);
double D=dis(x,y,x0,y0);
if(D<=r0)
{
cout<<"1.000000000"<<endl;
return 0;
}
if(r+r0+eps<D)continue;
double angl,angr,ang; double angm=atan2(y0-y,x0-x); if(angm<0)angm+=2*pi; double len1 = sqrt(D*D-r0*r0);
if(len1<r+eps){
ang=asin(r0/D);
}
else{
ang=acos((D*D+r*r-r0*r0)/(2.0*D*r));
} angl=angm-ang;
angr=angm+ang; if(angl<0){
a.push_back(make_pair(angl+2*pi,1));
a.push_back(make_pair(2*pi,-1));
a.push_back(make_pair(0,1));
a.push_back(make_pair(angr,-1));
}
else if(angr>2*pi){
a.push_back(make_pair(angl,1));
a.push_back(make_pair(2*pi,-1));
a.push_back(make_pair(0,1));
a.push_back(make_pair(angr-2*pi,-1));
}
else{
a.push_back(make_pair(angl,1));
a.push_back(make_pair(angr,-1));
}
}
sort(a.begin(),a.end());
double ans = 0;
double last = 0;
int now = 0;
for(int i=0;i<a.size();i++)
{
if(now>0)
ans+=a[i].first-last;
last=a[i].first;
now+=a[i].second;
}
printf("%.12f\n",ans/(2*pi));
}

Codeforces Round #357 (Div. 2) E. Runaway to a Shadow 计算几何的更多相关文章

  1. Codeforces Round #357 (Div. 2) D. Gifts by the List 水题

    D. Gifts by the List 题目连接: http://www.codeforces.com/contest/681/problem/D Description Sasha lives i ...

  2. Codeforces Round #357 (Div. 2) C. Heap Operations 模拟

    C. Heap Operations 题目连接: http://www.codeforces.com/contest/681/problem/C Description Petya has recen ...

  3. Codeforces Round #357 (Div. 2) B. Economy Game 水题

    B. Economy Game 题目连接: http://www.codeforces.com/contest/681/problem/B Description Kolya is developin ...

  4. Codeforces Round #357 (Div. 2) A. A Good Contest 水题

    A. A Good Contest 题目连接: http://www.codeforces.com/contest/681/problem/A Description Codeforces user' ...

  5. Codeforces Round #357 (Div. 2) A

    A. A Good Contest time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  6. Codeforces Round #357 (Div. 2) E 计算几何

    传说中做cf不补题等于没做 于是第一次补...这次的cf没有做出来DE D题的描述神奇 到现在也没有看懂 于是只补了E 每次div2都是hack前2~3题 终于打出一次hack后的三题了...希望以后 ...

  7. Codeforces Round #357 (Div. 2) 优先队列+模拟

    C. Heap Operations time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  8. Codeforces Round #357 (Div. 2) C

    C. Heap Operations time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  9. Codeforces Round #357 (Div. 2) B

    B. Economy Game time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

随机推荐

  1. centos7.2系统没有eth0网卡

    最近一直在学centos7.5系统,偶然看到虚拟机里有7.2系统所以想练习一下(其实7.2和7.5差不多),但是打开虚拟机之后,发现没有eth0网卡 那没有eth0网卡就无法远程连接ssh,既然遇到了 ...

  2. 监听 手机back键和顶部的回退

    // 回退事件,监听 手机back键和顶部的回退 pushHistory(); window.addEventListener("popstate", function(e) { ...

  3. JS实现全选、反选、不选

    JS实现全选.反选.不选 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  4. linux下Ctrl命令组合

    1.键盘组合键操作 ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程.常用于终止正在运行的程序. ctrl-z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程.  ...

  5. Linux学习笔记:nohup & 后台任务

    在linux中,使用nohup xxx.sh &可以将前台任务变成后台任务执行,如果只使用&的话,在突然断网或者关闭启动终端时,内核会向后台任务发送sighup信号,从而导致后台任务停 ...

  6. 中断、轮询、事件驱动、消息驱动、数据流驱动(Flow-Driven)?

    轮询.事件驱动.消息驱动.流式驱动 ---数据流驱动 Unidirectional Architecture? 中断.事件.消息这样一种机制来实现更好的在多任务系统里运行... 阻塞,非阻塞同步,异步 ...

  7. Ninject中调用webapi卡住的情况解决

    过年这两天在家做项目,把mvc升级到了5.1,webapi升级到了2.1,忽然发现一个问题,在某些页面上ajax调用webapi时会发现卡死现象,CPU也没有被占用,就是网页一些在加载也不报错,经过2 ...

  8. cent7.0 mysql 修改端口

    如何查看mysql 默认端口号和修改端口号 2015-03-19 17:42:18 1. 登录mysql [root@test /]# mysql -u root -p Enter password: ...

  9. hdoj1050 Moving Tables(贪心)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1050 题意 有一条走廊,走廊两边各有200个房间,一边的房间编号是奇数,另一边是偶数.现在有n个箱子需 ...

  10. RabbitMQ错误检查

    今天使用RabbitMQ做数据下发操作,当在发送端声明了Exchange后 打开RabbitMQ的管理控制台,可以查看,其中已经创建了Exchange 但并没有Queue 接着运行接收端,发现以下错误 ...