题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717
题 意:n个点的起始坐标和它们的运动方向,求这n个点的在哪个时刻最远距离最小
题 解:两点的距离为一个二次函数,对时间进行三分查找答案
#include <iostream> #include <cstdio> #include <cmath> using namespace std; struct point { double x,y; double vx,vy; }p[305]; int n; double dis(point a,point b,double t) { a.x+=a.vx*t; a.y+=a.vy*t; b.x+=b.vx*t; b.y+=b.vy*t; return sqrt ( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ); } double check(double t) { double MAX=0; for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) MAX=max(MAX,dis(p[i],p[j],t)); return MAX; } int main() { int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++) { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%lf%lf%lf%lf",&p[i].x,&p[i].y,&p[i].vx,&p[i].vy); double l=0; double r=1000000; while(l+1e-6<r) { double mid1=(l+r)/2.0; double mid2=(mid1+r)/2.0; if(check(mid1)<check(mid2)) r=mid2; else l=mid1; } printf("Case #%d: %.2lf %.2lf\n",cas,l,check(l)); } return 0; }
时间: 2024-10-25 03:28:00