Case #2: 1.00 1.00
求的是所有点之间的最大距离最小,考虑对于任意两个点来说,
它们之间的距离可以通过三分时间来确定最小值。
那么所有点之间的最大值也会呈现抛物线的形状。
通过三分时间,就可以直接求出距离了。
#include<map> #include<set> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<functional> using namespace std; #define ms(x,y) memset(x,y,sizeof(x)) #define rep(i,j,k) for(int i=j;i<=k;i++) #define per(i,j,k) for(int i=j;i>=k;i--) #define loop(i,j,k) for (int i=j;i!=-1;i=k[i]) #define inone(x) scanf("%d",&x) #define intwo(x,y) scanf("%d%d",&x,&y) #define inthr(x,y,z) scanf("%d%d%d",&x,&y,&z) #define infou(x,y,z,p) scanf("%d%d%d%d",&x,&y,&z,&p) #define lson x<<1,l,mid #define rson x<<1|1,mid+1,r #define mp(i,j) make_pair(i,j) #define ff first #define ss second typedef long long LL; typedef pair<int, int> pii; const int low(int x) { return x&-x; } const int INF = 0x7FFFFFFF; const int mod = 1e9 + 7; const int N = 1e5 + 10; const double eps = 1e-8; int T, n, cas = 1; int x[N], y[N], vx[N], vy[N]; double get(int i, double a, int j) { double xi = x[i] + a*vx[i], yi = y[i] + a*vy[i]; double xj = x[j] + a*vx[j], yj = y[j] + a*vy[j]; return sqrt((xi - xj)*(xi - xj) + (yi - yj)*(yi - yj)); } int main() { for (inone(T); T--; cas++) { inone(n); rep(i, 1, n) infou(x[i], y[i], vx[i], vy[i]); double l = 0, r = 1e6, d = INF; while (r - l > eps) { double a = (l + l + r) / 3, b = (l + r + r) / 3; double da = 0, db = 0; rep(i, 1, n) rep(j, i + 1, n) { double d1 = get(i, a, j), d2 = get(i, b, j); da = max(da, d1); db = max(db, d2); } if (da > db) l = a; else r = b; d = min(da, db); } printf("Case #%d: %.2lf %.2lf\n",cas, r, d); } return 0; }