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 }
To Be The Best Of Yourself