传说中做cf不补题等于没做 于是第一次补...这次的cf没有做出来DE D题的描述神奇 到现在也没有看懂 于是只补了E

每次div2都是hack前2~3题 终于打出一次hack后的三题了...希望以后能越来越好 早日..至少变成蓝色名字吧:)

E题意 有一个蟑螂 人要打死它 给出蟑螂的坐标 速度 人的瞄准时间 再给出一些阴影(圆形且给出坐标与半径) 若蟑螂移动到阴影内会立即停下 人不能打到阴影中的蟑螂 问它不被打死的机率 蟑螂的移动方向是随机的

需要注意的是蟑螂只会朝一个方向走直线

所以我们对于每一个阴影圆 都判断一次 能否走到 如果能走到 就计算角度 这里利用atan来实现 atan(x,y) 返回的是平面直角坐标系上原点到x,y的线与x轴的夹角

需要注意的是 在两个圆的相交到一定程度的时候需要进行判断 是否到了最大值 在到达最大值之后 角度会减小 这时候应当取最大的角度

对于每一个可以到达的阴影 我们都可以得出一个角度区间 最后我们应当对每个区间进行合并

在angle+-ang之后 可能产生<-pi or >pi的角度 这时候我们进行分割 分成两份 一份在最左 一份在最右

排个序再进行判断就好

在补这道题的时候 acos的时候写错了字母...一路跑到了test79才wa掉...真是..doubility

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
#include<queue>
using namespace std;
double x0,yy,v,t;
int n;
double pi;
struct node
{
double x,y,r;
};
node a[100050];
int w;
struct no
{
double k1,k2;
};
no b[100050];
double dis(double x1,double y1,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double r;
void check(int x){
if(dis(a[x].x,a[x].y,x0,yy)>=(r+a[x].r))
return ;
double d=dis(a[x].x,a[x].y,x0,yy);
/// -pi<angel<pi
double angle=atan2(a[x].x-x0,a[x].y-yy);
double r1=sqrt(d*d-a[x].r*a[x].r);
double ang;
if(r1<r){
ang=asin(a[x].r/d);
}
else {
ang=acos((d*d+r*r-a[x].r*a[x].r)/(2*d*r));
}
double al=angle-ang;
double ar=angle+ang;
if(al>=-pi-0.000000000001&&ar<=pi+0.000000000001){
w++;
b[w].k1=al;
b[w].k2=ar;
}
else if(al<-pi-0.000000000001){
w++;
b[w].k1=-pi;
b[w].k2=ar;
w++;
b[w].k1=pi+(al+pi);
b[w].k2=pi;
}
else if(ar>pi+0.000000000001){
w++;
b[w].k1=al;
b[w].k2=pi;
w++;
b[w].k1=-pi;
b[w].k2=-pi+(ar-pi);
}
return ;
}
int cmp(no a,no b){
return a.k1<b.k1;
return a.k2>b.k2;
}
int main(){
while(cin>>x0>>yy>>v>>t){
pi=acos(-1);
cin>>n;
bool ok=false;
for(int i=1;i<=n;i++){
scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].r);
if((x0-a[i].x)*(x0-a[i].x)+(yy-a[i].y)*(yy-a[i].y)<=a[i].r*a[i].r){
ok=true;
}
}
r=v*t;
if(ok==true){
printf("1.00000000000\n");
}
else {
w=0;
for(int i=1;i<=n;i++){
check(i);
}
if(w==0)
{
printf("0.00000000000\n");
}
else {
sort(b+1,b+1+w,cmp);
double ans=0;
double q=-pi;
for(int i=1;i<=w;i++)
{
double l=b[i].k1;
double r=b[i].k2;
if(r>q){
double ll;
if(l>q){
ll=l;
}
else {
ll=q;
}
if(r-ll>0)
ans+=(r-ll);
q=r;
}
else continue;
}
printf("%.11f\n",ans/(2*pi));
}
} }
}

  

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

  1. Codeforces Round #357 (Div. 2) E. Runaway to a Shadow 计算几何

    E. Runaway to a Shadow 题目连接: http://www.codeforces.com/contest/681/problem/E Description Dima is liv ...

  2. 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 ...

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

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

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

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

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

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

  6. 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 ...

  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. 将Excel文件.xls导入SQL Server 2005

    SQL2005 Microsoft SQL Server Management Studio Express管理器里,右键单击一个数据库,指向“任务”,再单击“导入数据”或“导出数据”中没有这个选项, ...

  2. MVC准备前基础知识

    一.自动属性C#自动属性可以避免原来这样我们手工声明一个私有成员变量以及编写get/set逻辑public class Product{ public int Id { get; set; } pub ...

  3. C++拷贝构造函数(深拷贝,浅拷贝)

    http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a;  ...

  4. Webservice加上SoapHeader验证方式

    提供一种基于SoapHeader的自定义验证方式,代码如下: public class MySoapHeader : System.Web.Services.Protocols.SoapHeader ...

  5. 14、Silverlight 滤镜到 UWP 滤镜的移植(二)

    上一篇文章 大致介绍了,移植戴震军大哥的 Windows Phone7 中,对于高斯模糊滤镜的移植,主要是 int[] 数组和 byte[] 数组的互相转换.同样的思路,只要把前文的方法封装一下,就能 ...

  6. hdu 4832 dp ***

    dp1[i][j]表示只走x轴走j步到i位置有多少总走法,dp2同,dp方程就很好写 wa了无数发,发现MOD写在INF上了 #include<cstdio> #include<io ...

  7. 【jacob word】使用jacob,合并多个word为一个word文件

    将几个word文件合并到一个word文件,使用注意点: 1.后面附项目运用的jar包jacob-1.9, 2.并且jacob运用中,需要将附件内的jacob.dll放到windows/system32 ...

  8. Android 编程下设置 Activity 切换动画

    为 Activity 设置切换动画 我们知道,我们可以在 AndroidManifest.xml 文件中,通过 android:theme 属性设置 Activity 的主题.主题中定义了关于 Act ...

  9. Hadoop_10_12虚拟机01_虚拟机NAT方式联网【自己的亲测笔记】

      NAT方式 1.查看网络信息--ifconfig(同windows中的ipconfig相同) 主要关注的是第三行内容,分别是Ip地址.广播地址.子网掩码 2.安装完系统后需要配置三个地方--IP地 ...

  10. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...