P9630 [ICPC2020 Nanjing R] Interested in Skiing 题解
题目大意
给定大小为
思路
我们考虑点需要经过第
为什么嘞
根据速度公式,我们有
于是
我们可以先将所有线段按照他们端点的
AC 代码
#include<bits/stdc++.h>
#define ls (i<<1)
#define rs (i<<1|1)
using namespace std;
struct node
{
int x,y;
}nd[205];
struct line
{
node f,l;
}ln[205];
int dis(node a,node b,node c){return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}
int pos(int x){return (!x)?0:(x>0?1:-1);}
int is(line l1,line l2){return max(l2.f.y,l2.l.y)>min(l1.f.y,l1.l.y)&&max(l2.f.x,l2.l.x)>min(l1.f.x,l1.l.x)&&pos(dis(l2.f,l1.f,l2.l))*pos(dis(l2.f,l1.l,l2.l))<0&&max(l1.f.y,l1.l.y)>min(l2.f.y,l2.l.y)&&pos(dis(l1.f,l2.f,l1.l))*pos(dis(l1.f,l2.l,l1.l))<0&&max(l1.f.x,l1.l.x)>min(l2.f.x,l2.l.x); }
bool cmp(node a,node b){return a.y<b.y;}
int n,m,v;
double dp[205],ans=1e20;
int check(node a,node b)
{
line x=line{a,b};
for(int i=0;i<n;i++)
if(is(x,ln[i]))
return 0;
return 1;
}
int main()
{
cin>>n>>m>>v;
for(int i=0;i<2*n;i++)
dp[i]=1e20;
for(int i=0;i<n;i++)
cin>>nd[ls].x>>nd[ls].y>>nd[rs].x>>nd[rs].y,ln[i]=line{nd[ls],nd[rs]};
sort(nd,nd+2*n,cmp);
for(int i=0;i<2*n;i++)
{
if(nd[i].x<=-m||nd[i].x>=m)
continue;
if(check(node{nd[i].x,-10001},nd[i]))
dp[i]=0;
for(int j=0;j<i;j++)
{
if(nd[j].y==nd[i].y)
break;
if(check(nd[j],nd[i]))
dp[i]=min(dp[i],max(dp[j],abs(1.0*(nd[i].x-nd[j].x)/(nd[i].y-nd[j].y))));
}
if(check(node{nd[i].x,10001},nd[i]))
ans=min(ans,dp[i]);
}
if(check(node{0,-10001},node{0,10001}))
ans=0;
if(ans>1e10)
printf("-1");
else
printf("%.10lf",ans*v);
return 0;
}