2013杭电 warm 2, hdu 4717 The Moving Points 三分
2013-09-23 23:30
429 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4717
第一次写三分,这个解法是学解题报告的,感谢原作者。
首先对每对点对,他们的距离关于时间t是二次函数,现在就是求c
[2] 个二次函数,每个点取最大值构成的函数的极值。
由于每个子函数都是先减后增,或者对称轴小于0,直接单增,他们的max一定也保持着这个性质 (具体证明和n个下凸函数max还是下凸函数很像?)
然后取100次精度就够了
代码:
第一次写三分,这个解法是学解题报告的,感谢原作者。
首先对每对点对,他们的距离关于时间t是二次函数,现在就是求c
[2] 个二次函数,每个点取最大值构成的函数的极值。
由于每个子函数都是先减后增,或者对称轴小于0,直接单增,他们的max一定也保持着这个性质 (具体证明和n个下凸函数max还是下凸函数很像?)
然后取100次精度就够了
代码:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int x[300],y[300],vx[300],vy[300]; int n; double f(double t) { double max=0; for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) { double cur=(x[i]+t*vx[i]-x[j]-t*vx[j])*(x[i]+t*vx[i]-x[j]-t*vx[j])+(y[i]+t*vy[i]-y[j]-t*vy[j])*(y[i]+t*vy[i]-y[j]-t*vy[j]); if(cur>max) max=cur; } return max; } int main() { int T; cin>>T; int index=0; while(T--) { cin>>n; for(int i=0;i<n;i++) scanf("%d%d%d%d",&x[i],&y[i],&vx[i],&vy[i]); double l=0,r=100000000,m1,m2; for(int i=0;i<100;i++) { m1=l+(r-l)/3; m2=r-(r-l)/3; if(f(m1)<f(m2)) r=m2; else l=m1; } double ans=sqrt(f(l)); printf("Case #%d: %.2lf %.2lf\n",++index,l,ans); } }
相关文章推荐
- 2013杭电 warm 2, hdu 4717 The Moving Points 三分
- 2013杭电 warm 2, hdu 4717 The Moving Points 三分
- hdu 4704 Sum/杭电2013年多校第十场1009 快速幂+循环
- 2013多校联合2 I Warm up 2(hdu 4619)
- hdu 4705 Y/杭电2013年多校第十场1010 组合
- hdu 4664 Triangulation/杭电多校2013第六场1010, SG定理+找规律
- 2013杭电warm_up1 1010 Difference Between Primes
- HDU杭电2013 多校第一场解题报告
- 2013杭电warm_up1 1010 Difference Between Primes
- 2013杭电warm up1 1002 Pet 求树结点的高度(bfs,dfs两种求法)
- 2013杭电warm_up1 1010 Difference Between Primes
- 杭电 hdu 2013
- HDU 4714 Tree2cycle DP 2013杭电热身赛 1009
- 2013多校联合2 I Warm up 2(hdu 4619)
- 2013杭电warm up1 1002 Pet 求树结点的高度
- hdu 2013 ACM/ICPC Asia Regional Online —— Warmup解题报告
- 2013杭电warm up1 1002 Pet 求树结点的高度(bfs,dfs两种求法)
- HDU 4639 hehe 杭电2013多校联赛第四场1008题
- 2013 Multi-University Training Contest 1 Warm up HDU 4612
- 杭电 hdu 3361