網易2019:矩形重疊

題目:

平面內有n個矩形, 第i個矩形的左下角座標爲(x1[i], y1[i]), 右上角座標爲(x2[i], y2[i])。

如果兩個或者多個矩形有公共區域則認爲它們是相互重疊的(不考慮邊界和角落)。

請你計算出平面內重疊矩形數量最多的地方,有多少個矩形相互重疊。

輸入描述:

輸入包括五行。
第一行包括一個整數n(2 <= n <= 50), 表示矩形的個數。
第二行包括n個整數x1[i](-10^9 <= x1[i] <= 10^9),表示左下角的橫座標。
第三行包括n個整數y1[i](-10^9 <= y1[i] <= 10^9),表示左下角的縱座標。
第四行包括n個整數x2[i](-10^9 <= x2[i] <= 10^9),表示右上角的橫座標。
第五行包括n個整數y2[i](-10^9 <= y2[i] <= 10^9),表示右上角的縱座標。

輸出描述:

輸出一個正整數, 表示最多的地方有多少個矩形相互重疊,如果矩形都不互相重疊,輸出1。

示例1

輸入

2
0 90
0 90
100 200
100 200

輸出

2

鏈接:

牛客網:

思路標籤:

  • 數學問題

解答:

  • 使用暴力求解,遍歷實現;
  • 遍歷每個在多少個矩形中出現,只要出現說明該點的矩形就會出現重疊。
  • 求出現次數最多的點,返回其次數即爲重疊的個數。
  • 暴力美學。
#include <iostream>
#include <set>
#include <algorithm>

using namespace std;
const int maxn = 50 + 5;
int X1[maxn], Y1[maxn];
int X2[maxn], Y2[maxn];
int a[110], b[110];

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> X1[i];
        a[i] = X1[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> Y1[i];
        b[i] = Y1[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> X2[i];
        a[i + n] = X1[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> Y2[i];
        b[i + n] = Y1[i];
    }
    int ans = 0;
    for (int x = 0; x<2 * n; x++)
    {
        for (int y = 0; y<2 * n; y++)
        {
            int cnt = 0;
            for (int i = 0; i < n; i++)
            {
                if (X1[i] <= a[x] && Y1[i] <= b[y] && X2[i] > a[x] && Y2[i] > b[y]) cnt++;
            }
            ans = max(ans, cnt);
        }
    }
    cout << ans << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章