zoukankan      html  css  js  c++  java
  • Codeforces Round #425 (Div. 2) C

    地址:http://codeforces.com/contest/832/problem/C

    题目:

    C. Strange Radiation
    time limit per test
    3 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    n people are standing on a coordinate axis in points with positive integer coordinates strictly less than 106. For each person we know in which direction (left or right) he is facing, and his maximum speed.

    You can put a bomb in some point with non-negative integer coordinate, and blow it up. At this moment all people will start running with their maximum speed in the direction they are facing. Also, two strange rays will start propagating from the bomb with speed s: one to the right, and one to the left. Of course, the speed s is strictly greater than people's maximum speed.

    The rays are strange because if at any moment the position and the direction of movement of some ray and some person coincide, then the speed of the person immediately increases by the speed of the ray.

    You need to place the bomb is such a point that the minimum time moment in which there is a person that has run through point 0, and there is a person that has run through point 106, is as small as possible. In other words, find the minimum time moment t such that there is a point you can place the bomb to so that at time moment t some person has run through 0, and some person has run through point 106.

    Input

    The first line contains two integers n and s (2 ≤ n ≤ 105, 2 ≤ s ≤ 106) — the number of people and the rays' speed.

    The next n lines contain the description of people. The i-th of these lines contains three integers xivi and ti (0 < xi < 106, 1 ≤ vi < s1 ≤ ti ≤ 2) — the coordinate of the i-th person on the line, his maximum speed and the direction he will run to (1 is to the left, i.e. in the direction of coordinate decrease, 2 is to the right, i.e. in the direction of coordinate increase), respectively.

    It is guaranteed that the points 0 and 106 will be reached independently of the bomb's position.

    Output

    Print the minimum time needed for both points 0 and 106 to be reached.

    Your answer is considered correct if its absolute or relative error doesn't exceed 10 - 6. Namely, if your answer is a, and the jury's answer is b, then your answer is accepted, if .

    Examples
    input
    2 999
    400000 1 2
    500000 1 1
    output
    500000.000000000000000000000000000000
    input
    2 1000
    400000 500 1
    600000 500 2
    output
    400.000000000000000000000000000000
    Note

    In the first example, it is optimal to place the bomb at a point with a coordinate of 400000. Then at time 0, the speed of the first person becomes 1000 and he reaches the point 106 at the time 600. The bomb will not affect on the second person, and he will reach the 0 point at the time 500000.

    In the second example, it is optimal to place the bomb at the point 500000. The rays will catch up with both people at the time 200. At this time moment, the first is at the point with a coordinate of 300000, and the second is at the point with a coordinate of 700000. Their speed will become 1500 and at the time 400 they will simultaneously run through points 0 and 106.

     思路:

      一看到是求最小时间,就应该想到是否可以二分。这题显然可以。

      二分时间,然后check的时候判断在当前时间下是否存在可行的炸弹放置区间。

      这题有几个需要注意的地方:

        1.只要左右各有一个人到就行了。

        2.炸弹放置的位置是整数点,注意如何取整。

        3.写代码时注意细节。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define MP make_pair
     6 #define PB push_back
     7 typedef long long LL;
     8 typedef pair<int,int> PII;
     9 const double eps=1e-8;
    10 const double pi=acos(-1.0);
    11 const int K=1e6+7;
    12 const int mod=1e9+7;
    13 
    14 struct node
    15 {
    16     int x,v,dir;
    17 }pp[K];
    18 int n,s;
    19 bool check(double x)
    20 {
    21     LL ll=1e6,lr=0,rl=1e6,rr=0,fl=0,fr=0;
    22     for(int i=1;i<=n;i++)
    23     if(pp[i].dir&1)//left
    24     {
    25         if(pp[i].x-1.0*(pp[i].v+s)*x>=0) continue;
    26         fl=1;
    27         if(pp[i].x-1.0*pp[i].v*x<=0.0){ll=0,lr=1e6;continue;}
    28         double t2=(pp[i].x-1.0*pp[i].v*x)/s;
    29         LL dx=(LL)(pp[i].x+floor((s-pp[i].v)*(x-t2)));
    30         ll=min(ll,(LL)pp[i].x),lr=max(lr,dx);
    31     }
    32     else
    33     {
    34         if(pp[i].x+1.0*(pp[i].v+s)*x<=1e6) continue;
    35         fr=1;
    36         if(pp[i].x+1.0*pp[i].v*x>=1e6){rl=0,rr=1e6;continue;}
    37         double t2=(1e6-pp[i].x-1.0*pp[i].v*x)/s;
    38         LL dx=(LL)(pp[i].x-floor((s-pp[i].v)*(x-t2)));
    39         rl=min(rl,dx),rr=max(rr,(LL)pp[i].x);
    40     }
    41     if(!(fl&&fr)) return 0;
    42     if(ll>lr || rl>rr) return 0;
    43     return !(ll>rr||lr<rl);
    44 }
    45 int main(void)
    46 {
    47     scanf("%d%d",&n,&s);
    48     for(int i=1;i<=n;i++)
    49         scanf("%d%d%d",&pp[i].x,&pp[i].v,&pp[i].dir);
    50     double l=0,r=1e6,mid,ans=-1;
    51     for(int i=1;i<=50;i++)
    52     {
    53         mid=(l+r)/2.0;
    54         if(check(mid)) r=mid,ans=mid;
    55         else l=mid;
    56     }
    57     printf("%.7f
    ",ans);
    58     return 0;
    59 }
  • 相关阅读:
    C#跨平台物联网通讯框架ServerSuperIO(SSIO)正式开源... 1
    神秘值分解(Singular Value Decomposition)
    mysql的sql执行计划详解(非常有用)
    springweb flux websocket
    springweb flux 服务器推送事件
    nodejs-express 报错View is not a constructor
    深入理解 Laravel Eloquent(三)——模型间关系(关联)
    Laravel 校验规则之字段值唯一性校验
    Notice: Trying to get property of non-object problem(PHP)解决办法 中间件只能跳转不能返任何数据
    慕客网laravel学习笔记
  • 原文地址:https://www.cnblogs.com/weeping/p/7231933.html
Copyright © 2011-2022 走看看