hdu4717The Moving Points(三分)

链接

需要特判一下n=1的时候

精度调太低会超时

 1 #include <iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<algorithm>

 5 #include<stdlib.h>

 6 #include<vector>

 7 #include<cmath>

 8 #include<queue>

 9 #include<set>

10 using namespace std;

11 #define N 310

12 #define LL long long

13 #define INF 1e8

14 const double eps = 1e-5;

15 const double pi = acos(-1.0);

16 const double inf = ~0u>>2;

17 struct point

18 {

19     double x,y;

20     double vx,vy;

21 }p[N],pp[N];

22 int n;

23 double dis(point a,point b)

24 {

25     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));

26 }

27 double calc(double tt)

28 {

29     int i,j;

30     for(i = 1 ; i <= n; i++)

31     {

32         pp[i].x=p[i].x+tt*p[i].vx;

33         pp[i].y=p[i].y+tt*p[i].vy;

34     }

35     double ans = 0.0;

36     for(i = 1 ; i <= n; i++)

37     {

38         for(j = 1 ; j <= n ;j++)

39         ans = max(ans,dis(pp[i],pp[j]));

40     }

41     return ans;

42 }

43 void solve(int k)

44 {

45     double M,RM;

46     double L = 0.0;

47     double R = INF;

48     while (L + eps < R)

49     {

50         M = (L + R) / 2;

51         RM = (M + R) / 2;

52         double s1 = calc(M);

53         double s2 = calc(RM);

54         if ( s1 < s2 ) R = RM;

55         else L = M;

56     }

57     printf("Case #%d: ",k);

58     printf("%.2f %.2f\n",R,calc(R));

59 }

60 int main()

61 {

62     int t,i;

63     int kk = 0;

64     cin>>t;

65     while(t--)

66     {

67         scanf("%d",&n);

68         for(i = 1; i <= n ;i++)

69         scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i].vx,&p[i].vy);

70         if(n==1)

71         {

72             printf("0.00 0.00\n");

73             continue;

74         }

75         solve(++kk);

76     }

77     return 0;

78 }
View Code

 

你可能感兴趣的:(poi)