Tinkoff Challenge - Elimination Round C. Mice problem(模拟)
发布日期:2021-05-09 01:10:56 浏览次数:18 分类:原创文章

本文共 1379 字,大约阅读时间需要 4 分钟。

题意

给出一个矩形的左下角和右上角的坐标,给出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\n",minn,maxn);    if(flag) { puts("-1");return 0; }    if(maxn+eps<=minn) printf("%f\n",maxn);else puts("-1");}
上一篇:ZOJ5593:Let's Chat(双指针)
下一篇:Codeforces Round #410 (Div. 2)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年05月17日 20时09分23秒