P2241 統計方形題解
阿新 • • 發佈:2021-07-18
解題思路:
1、正方形
我們以\((3,2)\)為圖形右下角端點進行解釋,這時可以構成的正方形共兩個,一個是邊長為\(1\)的,另一個是條邊為\(2\)的,沒有其它的了。為什麼\((3,2)\)兩個數字,一個是\(3\),一個是\(2\),結果受限於後面的\(2\),而無法突破呢?因為要照顧短的嘛。所以此時正方形個數=\(min(x,y)\)個。
2、矩形
用筆畫一下,就知道,一個長為\(3\),寬度為\(2\)的矩形,以現有右下角端點為右下角端點的子矩形個數是\(3 \times 2=6\)個,所以矩形個數=\(x \times y\)個。
3、長方形
\(長方形個數=矩形個數-正方形個數\)
二、C++程式碼
#include <bits/stdc++.h> using namespace std; typedef long long LL; /** 母題:P1548 一、算正方形的個數 列舉每一個格子,看以它為左上角的矩形共有多少個(正方形與長方形同屬於矩形) 二、算長方形個數(矩形=長方形+正方形) 1.其實算長方形並不常見,但算矩形大家應該經常遇到,所以如果你會算矩形,再聯絡第一個問題,那答案就轉化為 矩形個數-正方形個數. 2.像求解正方形個數一樣,固定矩形右下角(i,j),顯然此時矩形個數為i*j. 3.同理,求和即可.然後,再減去正方形的個數就是長方形的個數啦。 */ LL n, m, s1, s2; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { s1 += min(i, j);//也可以理解為左上角 s2 += i * j; //也可以理解為左上角開始,也是一樣的 } cout << s1 << " " << s2 - s1 << endl; return 0; }