P1147题解

__CrossBow_EXE__

2024-11-15 22:39:51

Solution

前言

我的想法与其他题解有不同之处。不同在于:我使用了一种比较新颖的办法——个人称为升降法,以及数形结合的思想。

题解

首先,观察这幅图:(图丑见谅)

不难发现,这些矩形就像是题目中的加数,依次递增,而且公差为一。我们想求它们的和,等价于求它们的面积和

接着,我们将这些矩形拦腰截断:

此时,图形分为上下两部分:上方可以看作一个三角,下方可以看作一个矩形。全图的面积自然是它们两个的面积之和。

三角形

我们小学时就学过,三角形的面积公式为 S= \frac{1}{2}ah,底乘高的积除以二。

不过,值得注意的一点是,这个三角形的底和高相等,都是那条红线。所以,它的面积也可以表示为 S=\frac{1}{2}a(a+1)

矩形

这个就更简单了,就是底乘高嘛。

经过上面的分析,我们发现:无论是三角形还是矩形,他们的面积都与下面的矩形的长和宽有关。

所以,我们可以枚举它的长和宽,看看面积和是否为 m,如果是的话输出即可。

至于输出什么,肯定是左边矩形的高度和右边矩形的高度了。如果用 i,j 表示矩形的长和宽,那答案就是 i,i+j-1

代码

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
int m;
int main(){
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>m;
    for(int i=1;i<=m;i++){//底座高度 
        for(int j=2;i*j<=m;j++){//底座宽度 
            int up=(j-1)*j/2;//上面的三角 
            int down=i*j;//下面的底座 
            if(up+down==m) cout<<i<<' '<<i+j-1<<endl;
        }
    }
    return 0;
}

感谢观看!