hdu 1700(圆最大内接三角形)

来源:互联网 发布:华为算法工程师好进吗 编辑:程序博客网 时间:2024/05/08 03:01

题目链接:hdu 1700

题意:给出以原点为圆心的圆上一个点,求以此点在从圆上找两个点求解三角形面积最大时,那两个点的坐标

分析:本题所用的三角形其实就是圆内接正三角形;

证明如下:

三角形的面积由底边和高两个因素决定,不管底边所在弦有多少,
但其高只有经过圆心的为最大,
故毫无质疑必须是等腰三角形。
设等腰三角形ABC,高AH,圆心O,AO=BO=R,OH=AH-AO,设高为x,
BH=√[R^2-(x-R)^2]=√(2Rx-x^2),
∴S=x√(2Rx-x^2),
dS=√(2Rx-x^2)+(1/2)*(2Rx-x^2)^(-1/2)*(2R-2x)*x=(2Rx-x^2+Rx-x^2)/√(2Rx-x^2)=0,
2x^2-3Rx=0,
x=3R/2,根据实际问题,该驻点有极大值,
即当x=3R/2时有最大面积,而高AH=3R/2,正是正三角形,
∴当圆内接正三角形时具有最大面积。
所以只需要求解出所给点绕圆心旋转120度所得点坐标即可,不过不要忘记所给答案是有顺序的,先按y再按x

代码如下:

#include <set>#include <map>#include <stack>#include <queue>#include <math.h>#include <vector>#include <string>#include <utility>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>#include <functional>using namespace std;const double pi=acos(-1);const int maxn=100005;const int INF=0x3f3f3f;const double eps=1e-5;int dcmp(double x){    if(fabs(x)<eps)return 0;    if(x>0)return 1;    return -1;}//精度为eps的比较struct Point{    double x,y;}p[maxn],a[maxn],b[maxn];bool cmpx(Point a,Point b){    return a.x<b.x;}//按x排序bool cmpy(Point a,Point b){    return a.y<b.y;}//按y排序Point cals(Point a,Point b,double r){    Point ans;    ans.x=(a.x-b.x)*cos(r)-(a.y-b.y)*sin(r)+b.x;    ans.y=(a.x-b.x)*sin(r)+(a.y-b.y)*cos(r)+b.y;    return ans;}//旋转int main(){    int t;    scanf("%d",&t);    Point ter;    ter.x=0;    ter.y=0;    while(t--){        Point a;        scanf("%lf%lf",&a.x,&a.y);        Point b,c;        b=cals(a,ter,pi*2/3);        c=cals(a,ter,pi*4/3);        Point ans;        if(dcmp(b.y-c.y)>0){            ans=b;            b=c;            c=ans;        }        if(dcmp(b.y-c.y)==0){        if(cmpx(b,c)!=1){                ans=b;                b=c;                c=ans;        }        }        printf("%.3f %.3f %.3f %.3f\n",b.x,b.y,c.x,c.y);    }    return 0;}


0 0