zoukankan      html  css  js  c++  java
  • hdu 4717 The Moving Points(三分)

    题目链接:hdu 4717 The Moving Points

    题意:

    在二维平面上有n个点,每个点给出移动的方向和速度。

    问在某个时刻,这些点中最大距离最小是多少,输出时刻和距离。

    题解:

    我们可以知道,每个点对的距离要么是单调递增,要么是有一个峰的函数。

    举例画一下可知道合成的这个函数最多只有一个峰,所以可以用三分求解。

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=a;i<=b;++i)
     3 using namespace std;
     4 
     5 const int N=307;
     6 int t,n,cas;
     7 double X[N],Y[N],VX[N],VY[N];
     8 
     9 double dis(double a,double b,double c,double d){return sqrt((c-a)*(c-a)+(d-b)*(d-b));}
    10 
    11 double check(double time)
    12 {
    13     double mx=0;
    14     F(i,1,n)F(j,1,n)
    15     mx=max(mx,dis(X[i]+time*VX[i],Y[i]+time*VY[i],X[j]+time*VX[j],Y[j]+time*VY[j]));
    16     return mx;
    17 }
    18 
    19 int main(){
    20     scanf("%d",&t);
    21     while(t--)
    22     {
    23         scanf("%d",&n);
    24         F(i,1,n)scanf("%lf%lf%lf%lf",X+i,Y+i,VX+i,VY+i);
    25         double l=0,r=1e7,mid,mmid;
    26         F(i,1,100)
    27         {
    28             mid=(l+r)/2,mmid=(mid+r)/2;
    29             if(check(mid)<check(mmid))r=mmid;else l=mid;
    30         }
    31         printf("Case #%d: ",++cas);
    32         check(l)>check(r)?printf("%.2f %.2f
    ",l,check(l)):printf("%.2f %.2f
    ",r,check(r));
    33     }
    34     return 0;
    35 }
    View Code
  • 相关阅读:
    HDU 2844 Coins(多重背包)
    HDU 4540 威威猫系列故事——打地鼠(DP)
    Codeforces Round #236 (Div. 2)
    FZU 2140 Forever 0.5
    HDU 1171 Big Event in HDU(DP)
    HDU 1160 FatMouse's Speed(DP)
    ZOJ 3490 String Successor
    ZOJ 3609 Modular Inverse
    ZOJ 3603 Draw Something Cheat
    ZOJ 3705 Applications
  • 原文地址:https://www.cnblogs.com/bin-gege/p/6910657.html
Copyright © 2011-2022 走看看