P10410 题解

· · 题解

本题其实不用复杂的数学推理。

思路

题目中要求的是 S_{\triangle\textrm{ABC}}最小值,不难推测出 S_{\triangle\textrm{ABC}} 是关于 p 的一个单谷函数,可以用三分求解。

关于三分中的计算,由于已知 \triangle\textrm{ABC} 的三点坐标,可以根据定比分点公式算出 \triangle\textrm{DEF} 的三点坐标,再根据海伦公式求出 S_{\triangle\textrm{DEF}} 的值。

AC CODE

#include<bits/stdc++.h>
using namespace std;
#define y1 y_1
double dis(double x1,double y1,double x2,double y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double S(double x1,double y1,double x2,double y2,double x3,double y3) {
    double a=dis(x1,y1,x2,y2);
    double b=dis(x2,y2,x3,y3);
    double c=dis(x3,y3,x1,y1);
    double s=(a+b+c)/2.0;
    return sqrt(s*(s-a)*(s-b)*(s-c));
}
double arr(double x1,double y1,double x2,double y2,double x3,double y3,double p) {
    double dx1=x2+(x1-x2)*p,dy1=y2+(y1-y2)*p;
    double dx2=x3+(x2-x3)*p,dy2=y3+(y2-y3)*p;
    double dx3=x1+(x3-x1)*p,dy3=y1+(y3-y1)*p;
    double ABC=S(x1,y1,x2,y2,x3,y3);
    double DEF=S(dx1,dy1,dx2,dy2,dx3,dy3);
    return DEF/ABC;
}
const double EPS=1e-9;
double l,r,x1,y1,x2,y2,x3,y3;
int main(){
    scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&l,&r,&x1,&y1,&x2,&y2,&x3,&y3);
    while(r-l>EPS){
        double mid1=l+(r-l)/3.0,mid2=r-(r-l)/3.0;
        if(arr(x1,y1,x2,y2,x3,y3,mid1)<arr(x1,y1,x2,y2,x3,y3,mid2))
            r=mid2;
        else l=mid1;
    }
    printf("%.12lf\n",S(x1,y1,x2,y2,x3,y3)*arr(x1,y1,x2,y2,x3,y3,l));
    return 0;
}