Tinkoff Challenge

传送门

题意

给出一个矩形的左下角和右上角的坐标,给出n个点的初始坐标和运动速度和方向,询问是否存在一个时间使得所有点都在矩形内,有则输出最短时间,否则输出-1

分析

对于每个点如果运动过程中都不在矩形内,输出-1
每个点的横纵运动分开考虑,判断处理得到点到达矩形边界的时间段,取交集,具体见代码

trick

1.all the mice that are strictly inside the mousetrap,即在矩形边界点不算入矩形
2.卡精度

代码

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define F(i,a,b) for(int i=a;i<=b;++i)
#define R(i,a,b) for(int i=a;i<b;++i)
#define mem(a,b) memset(a,b,sizeof(a))
#pragma comment(linker, "/STACK:102400000,102400000")
inline void read(int &x){x=0; char ch=getchar();while(ch<'0') ch=getchar();while(ch>='0'){x=x*10+ch-48; ch=getchar();}}

int n;
double x1,y1,x2,y2,rx,ry,vx,vy,minn,maxn;
const double eps = 1e-13;
bool flag;
void work(double loc,double v,double l,double r)
{
    if(fabs(v)<eps)
    {
        if((loc+eps)<=r&&(loc-eps)>=l) return ;
        else { flag=1;return ; }
    }
    if(v<0)
    {
        l=-l,r=-r,v=-v,loc=-loc;
        swap(l,r);
    }
    if(loc>r) { flag=1;return; }
    minn=min(minn,(r-loc)/v);
    if(loc<l) maxn=max(maxn,(l-loc)/v);
}
int main()
{
    scanf("%d",&n);
    scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
    minn=1e9,maxn=0;
    for(int i=1;i<=n;++i)
    {
        scanf("%lf%lf%lf%lf",&rx,&ry,&vx,&vy);
        if(flag) continue;
        work(rx,vx,x1,x2);
        work(ry,vy,y1,y2);
    }
    //printf("minn=%f maxn=%f
",minn,maxn);
    if(flag) { puts("-1");return 0; }
    if(maxn+eps<=minn) printf("%f
",maxn);else puts("-1");
}
原文地址:https://www.cnblogs.com/chendl111/p/6767930.html