zoukankan      html  css  js  c++  java
  • Codeforces 832C

    832C - Strange Radiation

    思路:二分最短时间。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pb push_back
    #define mp make_pair 
    #define pi acos(-1.0)
    #define pii pair<int,int>
    #define pil pair<int,long>
    #define mem(a,b) mamset(a,b,sizeof(a))
    
    const int MOD=1e9+7;
    const int INF=0x3f3f3f3f;
    const int N=1e5+5;
    const double eps=1e-9;
    
    int n;
    double s;
    
    struct people
    {
        double x,v,t;
    }a[N];
    
    bool check(double t)
    {
        bool flag1=false,flag2=false;
        double l_l=1e6,l_r=0,r_l=1e6,r_r=0;
        for(int i=0;i<n;i++)
        {
            if(a[i].t==1)
            {
                if(a[i].x-(a[i].v+s)*t>0)continue;//如果炸弹放在这个点上都到不了,说明这个人肯定到不了。 
                flag1=true;
                if(a[i].x-a[i].v*t<=0)//如果不加速也能到,那说明炸弹放在哪里都可以。 
                {
                    l_l=0;
                    l_r=1e6;
                    continue;
                }
                double X=floor((t*(s*s-a[i].v*a[i].v)+a[i].x*a[i].v)/s);
                l_r=max(l_r,X);//取并集 
                l_l=min(l_l,(double)a[i].x);
            }
            else if(a[i].t==2)
            {
                if(a[i].x+(a[i].v+s)*t<1e6)continue;
                flag2=true;
                if(a[i].x+a[i].v*t>=1e6)
                {
                    r_l=0;
                    r_r=1e6;
                    continue;
                }
                double X=ceil((1e6*(s-a[i].v)-t*(s*s-a[i].v*a[i].v)+a[i].x*a[i].v)/s);
                r_l=min(r_l,X);
                r_r=max(r_r,(double)a[i].x); 
            }
        }
        if(!flag1||!flag2)return false;
        if(l_l>l_r||r_l>r_r)return false;
        if(l_r<r_l||r_r<l_l)return false;//取交集 
        return true;
    }
    
    int main()
    {
        scanf("%d%lf",&n,&s);
        for(int i=0;i<n;i++)
        scanf("%lf%lf%lf",&a[i].x,&a[i].v,&a[i].t);
        
        double l=0,r=1e6+5;
        double mid=(l+r)/2;
        while(r-l>=eps)
        {
            if(check(mid))r=mid;
            else l=mid;
            mid=(l+r)/2;
        }
        printf("%.12lf
    ",mid);
        return 0;
    } 
  • 相关阅读:
    python 基础笔记十
    python 基础笔记十一
    python 基础笔记九-集合
    python 基础笔记八-time模块
    python 基础笔记七-OS模块
    python 基础笔记六-函数
    Python 基础笔记四
    4-5 元祖
    4-4 修改文件
    4-3 高效读取文件 --待完成
  • 原文地址:https://www.cnblogs.com/widsom/p/7422458.html
Copyright © 2011-2022 走看看