1. 程式人生 > >hdu 4717 The Moving Points(三分)

hdu 4717 The Moving Points(三分)

fine names -- sqrt blank .cn class 題目 col

題目鏈接:hdu 4717 The Moving Points

題意:

在二維平面上有n個點,每個點給出移動的方向和速度。

問在某個時刻,這些點中最大距離最小是多少,輸出時刻和距離。

題解:

我們可以知道,每個點對的距離要麽是單調遞增,要麽是有一個峰的函數。

舉例畫一下可知道合成的這個函數最多只有一個峰,所以可以用三分求解。

技術分享
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 const int N=307;
 6 int t,n,cas;
7 double X[N],Y[N],VX[N],VY[N]; 8 9 double dis(double a,double b,double c,double d){return sqrt((c-a)*(c-a)+(d-b)*(d-b));} 10 11 double check(double time) 12 { 13 double mx=0; 14 F(i,1,n)F(j,1,n) 15 mx=max(mx,dis(X[i]+time*VX[i],Y[i]+time*VY[i],X[j]+time*VX[j],Y[j]+time*VY[j])); 16 return
mx; 17 } 18 19 int main(){ 20 scanf("%d",&t); 21 while(t--) 22 { 23 scanf("%d",&n); 24 F(i,1,n)scanf("%lf%lf%lf%lf",X+i,Y+i,VX+i,VY+i); 25 double l=0,r=1e7,mid,mmid; 26 F(i,1,100) 27 { 28 mid=(l+r)/2,mmid=(mid+r)/2; 29 if
(check(mid)<check(mmid))r=mmid;else l=mid; 30 } 31 printf("Case #%d: ",++cas); 32 check(l)>check(r)?printf("%.2f %.2f\n",l,check(l)):printf("%.2f %.2f\n",r,check(r)); 33 } 34 return 0; 35 }
View Code

hdu 4717 The Moving Points(三分)