/*
Gym 100971F
题目大意是
给定两个点及其运动速度
问什么时候离的最近
我们先设t然后可以得到
xx1=x1+t*vx1;
yy1=y1+t*vy1;
xx2=x2+t*vx2;
yy2=y2+t*vy2;
两个点的坐标
然后表示长度
len=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2))
如果还看不出来可以手动化简一下
可以化简出一个关于t的二次方程
然后三分查找就行
*/
#include <bits/stdc++.h>
#define ll long long
using namespace std;
double x1,y11,x2,y2;
double vx1,vy1,vx2,vy2;
double dis(double t)
{
double xx1=x1+t*vx1;
double yy1=y11+t*vy1;
double xx2=x2+t*vx2;
double yy2=y2+t*vy2;
double len=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
return len;
}
int main()
{
cin>>x1>>y11>>x2>>y2;
cin>>vx1>>vy1>>vx2>>vy2;
double l=0,r=1e18;
double m1,m2;
while(r-l>1e-12)
{
m1=l+(r-l)/3;
m2=r-(r-l)/3;
if(dis(m1)<dis(m2))
r=m2;
else
l=m1;
}
printf("%f\n",dis(l));
return 0;
}
Gym 100971F
题目大意是
给定两个点及其运动速度
问什么时候离的最近
我们先设t然后可以得到
xx1=x1+t*vx1;
yy1=y1+t*vy1;
xx2=x2+t*vx2;
yy2=y2+t*vy2;
两个点的坐标
然后表示长度
len=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2))
如果还看不出来可以手动化简一下
可以化简出一个关于t的二次方程
然后三分查找就行
*/
#include <bits/stdc++.h>
#define ll long long
using namespace std;
double x1,y11,x2,y2;
double vx1,vy1,vx2,vy2;
double dis(double t)
{
double xx1=x1+t*vx1;
double yy1=y11+t*vy1;
double xx2=x2+t*vx2;
double yy2=y2+t*vy2;
double len=sqrt((xx1-xx2)*(xx1-xx2)+(yy1-yy2)*(yy1-yy2));
return len;
}
int main()
{
cin>>x1>>y11>>x2>>y2;
cin>>vx1>>vy1>>vx2>>vy2;
double l=0,r=1e18;
double m1,m2;
while(r-l>1e-12)
{
m1=l+(r-l)/3;
m2=r-(r-l)/3;
if(dis(m1)<dis(m2))
r=m2;
else
l=m1;
}
printf("%f\n",dis(l));
return 0;
}