题解:P6468 [COCI2008-2009#6] BAZEN

· · 题解

题意简述:

在一个直角边长为 250 的等腰直角三角形中,给定一个在三角形边上的一点,要求找出同样一个在三角形边上的点,使得两点的连线可以将此三角形的面积平分。保留两位小数。

知识预览:

初中的三角形基础知识;分类讨论思想。

具体思想:

本题要求分类讨论思想能力较高,具体的,令给定的点的坐标为 (a,b),可分为如下几种情况:

  1. 当给定的点在这个三角形的 三个顶点 上时:由初中的三角形中线定理可得:三角形的中线平分这个三角形的面积。也就是目标点在给定点的 对边的中点上
  2. 当给定的点在这个三角形 三边的中点 上时:由( 1 )反推:给定点位于目标点的 对边的中点上
  3. 当给定的点在这个三角形的 斜边(即 AB 边)上时:若 a>125 ,则目标点 AC;若 a<125 ,则目标点 BC
  4. 当给定的点在这个三角形的 直角边(即 AC 以及 BC 边)上时:则目标点在 斜边 AB

具体公式请读者自行画图理解,运用三角形的面积公式的灵活变换寻求答案。

代码如下:

#include<bits/stdc++.h>
using namespace std;
double x,y,s=31250.0;
int main(){
    cin>>x>>y;
    if(x==0&&y==0){
        cout<<"125.00 125.00";
        exit(0);
    }
    if(x==250&&y==0){
        cout<<"0.00 125.00";
        exit(0);
    }
    if(x==0&&y==250){
        cout<<"125.00 0.00";
        exit(0);
    }
    if(x==125&&y==125){
        cout<<"0.00 0.00";
        exit(0);
    }
    if(x==0&&y<250){
        if(y>125.0){
            double h=s/y;
            cout<<fixed<<setprecision(2)<<h<<" 0.00";
        }
        else{
            double d=250.0-y;
            double h=s/d;
            cout<<fixed<<setprecision(2)<<h<<" "<<250.00-h
        }
        exit(0);
    }
    if(y==0&&x<250){
        if(x>125.0){
            double h=s/x;
            cout<<fixed<<setprecision(2)<<"0.00 "<<h;
        }
        else{
            double d=250.0-x;
            double h=s/d;
            cout<<fixed<<setprecision(2)<<250.00-h<<" "<<h;
        }
        exit(0);
    }
    if(x+y==250&&x>y){
        double d=s/x;
        cout<<fixed<<setprecision(2)<<"0.00 "<<250.00-d;
        exit(0);
    }
    if(x+y==0&&x<y){
        double d=s/y;
        cout<<fixed<<setprecision(2)<<250.00-d<<" 0.00";
        exit(0);
    }
}

好了,最后给大家留个证明题:在 AB 边上的点的横纵坐标的和为 250。很简单的。