zoukankan      html  css  js  c++  java
  • Codeforces Round #357 (Div. 2) Runaway to a Shadow

     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

    题解

    计算几何题

    思路很简单,算出这个点与每个圆的夹角区间,取并集再除以2pi就行了

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 100000+100;
    const double eps = 1e-6;
    const double pi = acos(-1);
    
    double getdis(double x,double y,double x1,double y1)
    {
        return sqrt((x-x1)*(x-x1)+(y-y1)*(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=1;i<=n;i++){
            double x1,y1,r1;
            scanf("%lf%lf%lf",&x1,&y1,&r1);
            double dist=getdis(x,y,x1,y1);
            if(dist<=r1){
                printf("1.0000000000
    ");
                return 0;
            }
            if(r+r1+eps<dist) continue;
            double ang,angm,angl,angr;
    
            angm=atan2(y1-y,x1-x);
            if(angm<0)angm+=2*pi;
    
            double len=sqrt(dist*dist-r1*r1);
            if(len<r+eps) ang=asin(r1/dist);
            else ang=acos((dist*dist+r*r-r1*r1)/(2.0*dist*r));
    
            angl=angm-ang;
            angr=angm+ang;
    
            if(angl<0){
                a.push_back(make_pair(2*pi+angl,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("%.12lf",ans/(2*pi));
        return 0;
    }
  • 相关阅读:
    C语言的swap函数的易错点
    C语言结构体指针,及其错误示范
    操作系统--问答题
    数据库-存储过程、触发器、视图-考研笔记
    数据库知识-恢复子系统、数据库恢复的基本技术、转储方法、日志文件、undo/redo操作、数据库镜像
    c语言,快排序找出第k小/大的数
    STM32的Flash读写保护,SWD引脚锁的各种解决办法汇总(2020-03-10)
    uCOS全家桶PDF文档整理汇总贴,提供论坛,百度云和腾讯云下载(2020-03-09)
    分享下之前做的STM32嵌入式Web完整设计教程和案例html,Ajax,Javacript,XML,cgi等
    【STM32H7教程】第71章 STM32H7的内部Flash应用之模拟EEPROM
  • 原文地址:https://www.cnblogs.com/wangdongkai/p/5592091.html
Copyright © 2011-2022 走看看