题意:在一个平面上有很多运动的点,问那一个时刻,所有点的最大距离最小。
思路:分析对于两个点,他们之间的距离随时间一定是一个二次函数,距离一定是先减小,再增大。所以用三分逼近这个最小值。
#include<bits/stdc++.h>
using namespace std;
int n;
const double les=1e-6;
struct node
{
double x,y,vx,vy;
}a[500];
double dis(node a,node b,double t)
{
return sqrt((a.x+a.vx*t-b.x-b.vx*t)*(a.x+a.vx*t-b.x-b.vx*t)+(a.y+a.vy*t-b.y-b.vy*t)*(a.y+a.vy*t-b.y-b.vy*t));
}
double check(double x)
{
double maxx=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
maxx=max(maxx,dis(a[i],a[j],x));
}
}
return maxx;
}
int main()
{
int T,t=1;scanf("%d",&T);
while(T--){
double maxx=-1;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&a[i].vx,&a[i].vy);
double l=0,r=1000000;
while(l+les<=r){
double mid=(l+r)*0.5;
double midd=(mid+r)*0.5;
if(check(mid)<check(midd)) r=midd;
else l=mid;
}
printf("Case #%d: %.2f %.2f\n",t++,r,check(r));
}
}