HDU4714+三分

题意:给定N个点,每个点有初始位置和初始速度。

问:在哪个时刻 使得所有的点的最大距离值最小。

分析:一开始枚举两两之间的最大值,然后在最大值中求一个最小值。。。(WA:题意严重理解不清。。)

由两点之间的距离公式(与T一个系数有关)可知,这个公式是典型的抛物线,因此可以进行三分查找答案,正解!

 1 /*
 2 wa
 3 */
 4 #include<algorithm>  
 5 #include<iostream>  
 6 #include<string.h>  
 7 #include<stdlib.h>  
 8 #include<stdio.h>  
 9 #include<math.h>  
10 #include<queue>  
11 #include<stack>  
12 #include<map>  
13 #include<set>  
14 using namespace std;  
15 typedef long long int64;  
16 //typedef __int64 int64;  
17 typedef pair<int64,int64> PII;  
18 #define MP(a,b) make_pair((a),(b))   
19 const double inf =  9999999999.0;  
20 const double inf2 = 1.0*(1e8);
21 const double pi=acos(-1.0);  
22 const int dx[]={1,-1,0,0};  
23 const int dy[]={0,0,1,-1};  
24 const double eps = 1e-8;  
25 const int maxm = 1005;  
26 const int maxn = 305;  
27 
28 struct NODE{
29     double t,d;
30 }mat[ maxn ][ maxn ];
31 struct Point{
32     double x,y;
33     double vx,vy;
34 }pnt[ maxn ];
35 
36 double solve( double t,int n ){
37     double dis = 0;
38     for( int i=0;i<n;i++ ){
39         for( int j=i+1;j<n;j++ ){
40             dis = max( dis, (pnt[i].x-pnt[j].x+pnt[i].vx*t-pnt[j].vx*t)*(pnt[i].x-pnt[j].x+pnt[i].vx*t-pnt[j].vx*t)+(pnt[i].y-pnt[j].y+pnt[i].vy*t-pnt[j].vy*t)*(pnt[i].y-pnt[j].y+pnt[i].vy*t-pnt[j].vy*t) );
41         }
42     }
43     return sqrt(dis);
44 }
45 
46 int main(){
47     int T;
48     int ca = 1;
49     scanf("%d",&T);
50     while( T-- ){
51         int n;
52         scanf("%d",&n);
53         for( int i=0;i<n;i++ ){
54             scanf("%lf%lf%lf%lf",&pnt[ i ].x,&pnt[ i ].y,&pnt[ i ].vx,&pnt[ i ].vy);
55         }
56         double L = 0;
57         double R = inf2;
58         double ans_d = inf;
59         double ans_t = inf;
60         while( L+eps<R ){
61             double mid1 = ( L+R )/2.0;
62             double mid2 = ( mid1+R )/2.0;
63             double d1 = solve( mid1,n );
64             double d2 = solve( mid2,n );
65             if( d1<=d2 ) {
66                 if( d1<ans_d ){
67                     ans_t = mid1 ;
68                     ans_d = d1;
69                 }
70                 else if( d1==ans_d )
71                     ans_t = min( ans_t,mid1 );
72                 R = mid2;
73             }
74             else {
75                 if( d2<ans_d ){
76                     ans_t = mid2 ;
77                     ans_d = d2;
78                 }
79                 else if( d2==ans_d )
80                     ans_t = min( ans_t,mid2 );
81                 L = mid1;
82             }
83             //printf("L = %lf,R = %lf\n",L,R);
84         }
85         printf("Case #%d: %.2lf %.2lf\n",ca++,ans_t,ans_d);
86     }
87     return 0;
88 }
View Code

 

posted @ 2013-12-03 21:15  xxx0624  阅读(289)  评论(0)    收藏  举报