zoukankan      html  css  js  c++  java
  • 2016HUAS_ACM暑假集训2L

    一个简单的几何题,自己在纸上列出方程解出结果的表达式,再用程序表达出来就行了。

    不过老司机(老司机的woodcoding)说用旋转向量法比较简单,有时间要去看一看。

    大致题意:一个圆心在原点的圆,半径未知,现在给你圆上的一点,让你在这个圆上找到另外两点,使得这三点构成的三角形的周长最长。

    样例输入:(第一行为一个整数N,表示后面有N组案例,每个案例给出一组圆上点的坐标)

    2

    1.500        2.000

    563.585    1.251

    样例输出:(其他两个点的坐标)

    0.982 -2.299 -2.482 0.299

    -280.709  -488.704  -282.876  487.453

    主要思路:首先,一个圆的内接三角形周长最长的是正三角形。设给出的为点A(x,y),圆的半径为R,连接AO,反向延长AO与圆交于点O',以O'为圆心,R为半径画圆,两个圆的交点坐标就是所求的答案。

    记O'(a,b),(a=-x,b=-y)目的只是为了防止混淆。

    联立x²+y²=R² ① 和 (x-a)²+(y-b)²=R² ②,然后自己打草稿即可。

     1 #include<stdio.h>
     2 #include<math.h>
     3 int T;
     4 int main()
     5 {
     6     double x,y,a,b,x1,y1,x2,y2,R,A,B,C;//R是圆半径的平方
     7     scanf("%d",&T);
     8     while(T--)
     9     {
    10         scanf("%lf %lf",&x,&y);
    11         a=-x;b=-y;//(x,y)的对称点(a,b)
    12         R=x*x+y*y;
    13         A=R;
    14         B=-R*b;
    15         C=R*R/4-a*a*R;
    16         y1=(-B-sqrt(B*B-4*A*C))/(2*A);
    17         y2=(-B+sqrt(B*B-4*A*C))/(2*A);//求出y1,y2后还不能马上算x1,x2,防止x作除数
    18         if(x==0)
    19         {
    20             x1=-sqrt(R-y1*y1);
    21             x2=sqrt(R-y2*y2); 
    22         }
    23         else
    24         {
    25             x1=(R/2-b*y1)/a;  
    26             x2=(R/2-b*y2)/a;  
    27         }
    28         printf("%.3lf %.3lf %.3lf %.3lf
    ",x1,y1,x2,y2);
    29     }
    30     return 0;
    31 }
    View Code
  • 相关阅读:
    P3833 [SHOI2012]魔法树 (树链剖分模板题)
    2019 Multi-University Training Contest 4 1008K-th Closest Distance(二分+主席树)
    bzoj3631: [JLOI2014]松鼠的新家(树上差分)
    bzoj4326: NOIP2015 运输计划(二分+LCA+树上差分)
    目录
    希望是一个全新的开始
    模板
    模板
    SCUT
    模板
  • 原文地址:https://www.cnblogs.com/ankelen/p/5686025.html
Copyright © 2011-2022 走看看