题解 AT4236 【[ABC130C] Rectangle Cutting】

· · 题解

前言

这道题乍一看,相信很多人都毫无头绪,我承认我也是这样的。(如果你们不是,只能说我太菜了啊啊啊啊啊)

但是,如果你一看到这道题你就想放弃,你就输了!

高能预警:本题解涉及到一定的几何知识。不过,如果你对此没有接触过,也不会影响对于本题的理解。放心!

思路

来吧,读题。将长方形分成两个部分,使面积小的部分尽量大。

长方形的面积已经确定了。不妨设面积小的为a,大的为b,总面积为S,则有:

a+b=S

等式性质一下:

a=S-b

也就是说,a要大,b得小。那么好了,ab尽量接近就行了呀。

那能不能a=b呢?

接下来就简单来证明一下任意经过长方形中心点的直线平分长方形的面积:

(如果你还没有学过几何证明,你可以先记住结论,以后你就会自己证明了!)

证明

如图,ABCD为长方形,BDAC为其对角线,交于点O

过点O作任意直线EF,交ADEBCF

先利用长方形的基本性质:AD//BC∠ADB=∠DBC

然后对角线互相平分:BO=DO

再来一组对顶角相等:∠EOD=∠FOB

这样三个条件就齐了,有△EOD≌△FOB

所以这两个三角形面积相等。

还有,对角线将长方形分为两个面积相等的三角形,最后加加减减等式性质一下,左右两个四边形的面积就相等啦!

至此我们证明了:过长方形内任意一点,都可以作出直线平分四边形面积。所以,面积只要输出长方形面积的一半就可以了:

cout<<fixed<<setprecision(6)<<w*h/2<<" ";

当然,你还可以证明不经过长方形中心点的直线不平分长方形的面积。在此我就不介绍具体方法了。这就说明非中心点的点只有1条直线平分长方形面积。

继续。如果这个点(x,y)在中心点,那么就有无数条直线平分长方形面积,输出1,否则就输出0

一个点如果是中心点:

x==w/2.0&&y==h/2.0 //比较好理解,就不解释了

现在我们彻底把思路理清了。上完整代码咯~

完整代码

#include <bits/stdc++.h> //万能头文件!!
using namespace std;
int main()
{
    double w,h,x,y;//题目没有说是整数,定义double
    cin>>w>>h>>x>>y;
    cout<<fixed<<setprecision(6)<<w*h/2<<" ";//保留6位小数不要漏了哦!
    if (x==w/2.0&&y==h/2.0) cout<<1;//如果是中心点,有无数条直线,输出1
    else cout<<0;//否则就不是中心点,只有一条直线,输出0
    return 0;//别忘了!千万别功亏一篑呀~
}

好了,祝贺又AC了一题!几何的说理过程如果看不懂的话记住结论就可以了,你也能写出代码的!

The$ $end

修改记录

$2020/5/6$ 优化语言、文字样式、格式等 $2020/6/20$ 添加几何证明中的图片并优化部分语言