zoukankan      html  css  js  c++  java
  • HihoCoder 1570 : 小Hi与法阵(简单几何)

    描述

    小Hi喜欢大,而小Ho喜欢小。他们所在的城市(视为二维平面)有N座法阵。现在他们各选三座法阵,以三座法阵为顶点组成三角形,并站在所选三角形的重心位置;二人选择的法阵可以有相同的。小Hi选择面积最大的三角形,小Ho选择面积最小的三角形。若有多个面积相同且符合他们要求的三角形,小Hi选择重心横坐标最大的,若重心横坐标相同,则选择重心纵坐标最大的;小Ho选择重心横坐标最小的,若重心横坐标相同,则选择重心纵坐标最小的。

    现在两人需要见面,两人均可以在城市里以不超过U的速度向任意方向移动,问他们两个最少经过多长时间可以相会?  

    例如下图中的例子,共六座法阵,分别为A,B,C,D,E,F,则小Hi位于三角形ABC的重心G上,小Ho位于三角形DEF的重心H上。

    注意两人选择的三座法阵必须能组成三角形,不能是共线的。

    输入

    输入包含多组数据,第一行包含一个数字T,代表数据组数。1<=T<=10

    对于每组数据:

    第一行为两个整数N、U,分别代表法阵数量和最高移动速度。3<=N<=50,1<=U<=10

    接下来N行,每行两个整数Xi和Yi,代表第i所法阵的横纵坐标。-300<=Xi,Yi<=300。

    输入保证法阵位置不同。

    输出

    对于每组数据,输出一行,包含一个数字,代表相会时间,四舍五入保留到小数点后2位。

    样例输入

    1
    3  1
    0 10
    -10 0
    10 5

    样例输出

    0.00
    • 面积可以用向量法或者海伦公式求。
    • 判断是否共线,不能直接用斜率相同。解决方案是1,特判y轴相同。2,把除法变为乘法。3,向量法求得的面积为0。
    • 用整数避开浮点数的误差。
    //向量法
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=60;
    const int inf=100000000;
    int x[maxn],y[maxn];
    int get_S(int i,int j,int k)
    {
          return abs((x[j]-x[i])*(y[k]-y[i])-(x[k]-x[i])*(y[j]-y[i]));
    }
    int main()
    {
        int x1,y1,x2,y2;
        int Min,Max;
        int i,j,k,n,u,T;
        scanf("%d",&T);
        while(T--){
            Min=inf;Max=-inf;
            x1=0;y1=inf;x2=0;y2=inf;
            scanf("%d%d",&n,&u);
            for(i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
            for(i=1;i<=n;i++)
               for(j=i+1;j<=n;j++)
                 for(k=j+1;k<=n;k++){
                   int tmp=get_S(i,j,k);               
                   if(tmp==0)  continue;
                   int tx=(x[i]+x[j]+x[k]),ty=(y[i]+y[j]+y[k]);
                   if(tmp<Min||(tmp==Min&&tx<x1)||(tmp==Min&&tx==x1&&ty<y1)) { Min=tmp;x1=tx;y1=ty;}
                   if(tmp>Max||(tmp==Max&&tx>x2)||(tmp==Max&&tx==x2&&ty>y2)) { Max=tmp;x2=tx;y2=ty;}
              }
            double dx=(x1-x2)/3.0,dy=(y1-y2)/3.0;
            printf("%.2lf
    ",sqrt(dx*dx+dy*dy)/u/2.0);
        }return 0;
    }
  • 相关阅读:
    重构之重新组织函数(Split Temporary Variable)
    HammperSpoon 不能 Focus Google Chrome 的问题
    如何让 vim 可以在命令行执行命令并且附加参数
    This bison version is not supported for regeneration of the Zend/PHP parsers
    php cURL library is not loaded
    aws linuxbrew GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2
    gen-cpp/.deps/ChildService.Plo: No such file or directory
    快速解码base64和utf-8的ASCII编码和URL解码
    英文版firefox显示中文字体丑的问题
    linux find 反转 查找没有被找到的结果
  • 原文地址:https://www.cnblogs.com/hua-dong/p/8320803.html
Copyright © 2011-2022 走看看