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;
    }
  • 相关阅读:
    leetcode 78. 子集 JAVA
    leetcode 91. 解码方法 JAVA
    leetcode 75. 颜色分类 JAVA
    leetcode 74 搜索二维矩阵 java
    leetcode 84. 柱状图中最大的矩形 JAVA
    last occurance
    first occurance
    classical binary search
    LC.234.Palindrome Linked List
    LC.142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/hua-dong/p/8320803.html
Copyright © 2011-2022 走看看