HDU 4717 The Moving Points

新学的知识点,三分,参考资料:http://wenku.baidu.com/view/4a5aac8884868762caaed521.html

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717

讲一下题目的思路。

总得来说这道题就是模拟加三分,利用的是三分的一个特点(上面的参考资料有详细讲)。 

即搜索的有向性,可以根据实际情况来选择搜索方向。

而这道题里面,T时间里最大两点距离的变化应该是,从小到大再到小,正好是三分的特点。

但是算法的正确性却无从证明。

所以,想思路,有时候靠的是直觉吧。

以0,T(T=10000000)为时间搜索区间,计算mid1 (mid1=(L+R)/ 3),mid2(mid2 = R - mid 1) 时刻最大两点距离。

然后再根据情况选择搜索区间。

亲们,还是直接看代码吧。

特别说一句,自从因为数据读入错误所导致各种WA以后,包括double在内的64位数据我都用cin&cout了,另外计算的时候也要控制精度。

上代码:

 1 #include<stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 #include<queue>
 5 #include<math.h>
 6 #include<algorithm>
 7 #include<string.h>
 8 #include<vector>
 9 #include<map>
10 #include<set>
11 
12 #define repA(p,q,i)  for( int (i)=(p); (i)!=(q); ++(i) )
13 #define repAE(p,q,i)  for( int (i)=(p); (i)<=(q); ++(i) )
14 #define repD(p,q,i)  for( int (i)=(p); (i)!=(q); --(i) )
15 #define repDE(p,q,i)  for( int (i)=(p); (i)>=(q); --(i) )
16 #define mini 0.00001  //mini不要定得太小,要在double的能有效表数字以内
17 #define range 310
18 #define maxn 1e10
19 
20 double x[range];
21 double y[range];
22 double xd[range];
23 double yd[range];
24 int n;
25 double rtime,dist;
26 
27 double disCalcu( double t );
28 void solve();
29 
30 int main()
31 {
32     int test;  scanf("%d",&test);
33     repAE(1,test,round)
34     {
35         scanf("%d",&n);
36         repA(0,n,i)
37             cin>>x[i]>>y[i]>>xd[i]>>yd[i] ;
38         solve();
39         printf("Case #%d: %.2lf %.2lf\n",round,rtime,dist) ;
40     }
41     return 0;
42 }
43 
44 void solve()
45 {
46         rtime = 0 ;
47         double r = maxn ;
48     double mid1, mid2 ;
49     double dis1, dis2 ;
50         while( r-rtime >= mini )
51     {
52         mid1 = rtime + (r-rtime) / 3 ;
53         mid2 = r - (r-rtime) / 3 ;
54         dis1 = disCalcu( mid1 ) ;
55         dis2 = disCalcu( mid2 ) ;
56         if( dis1 > dis2 )  //往右边搜索
57             rtime = mid1 + mini ;
58         else r = mid2 - mini ;
59     }
60     dist = disCalcu(rtime) ;
61 }
62 
63 double disCalcu( double t )
64 {
65     double maxdis = 0 ;
66     repA(0,n,i)
67     {
68         x[i] += t*xd[i] ;
69         y[i] += t*yd[i] ;            
70     }
71     repA(0,n-1,i)
72       repA(i+1,n,j)
73         maxdis = max(maxdis, sqrt( (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]) )  ) ;
74     repA(0,n,i)
75     {
76         x[i] -= t*xd[i] ;
77         y[i] -= t*yd[i] ;            
78     }
79     return maxdis;
80 }
View Code

 

posted on 2013-09-13 02:52  码农之上~  阅读(217)  评论(0编辑  收藏  举报

导航