網易2018實習生筆試程式設計題
阿新 • • 發佈:2019-02-03
平面內有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
輸出例子1:
2
思路:
存下所有的x座標和y座標,然後分別進行排序。然後我們得到了兩個陣列,一個是x座標的陣列,一個是y座標的陣列,分別都有2n個整數,就有2n*2n個點,我們算這每個點被多少個矩形包含就行。#include <iostream> #include <iostream> #include <algorithm> #include <unordered_map> #include <unordered_set> #include <set> #include <vector> #include <map> #include <set> #include <queue> #include <string> using namespace std; class juxing { public: int lb_x; int lb_y; int rt_x; int rt_y; juxing(int a, int b, int c, int d): lb_x(a), lb_y(b), rt_x(c), rt_y(d){} }; int main() { int n; scanf("%d", &n); vector<int> lbX(n); for (int i = 0; i < n; i++) scanf("%d", &lbX[i]); vector<int> lbY(n); for (int i = 0; i < n; i++) scanf("%d", &lbY[i]); vector<int> rtX(n); for (int i = 0; i < n; i++) scanf("%d", &rtX[i]); vector<int> rtY(n); for (int i = 0; i < n; i++) scanf("%d", &rtY[i]); vector<juxing> AllJuXing; for (int i = 0; i < n; i++) AllJuXing.push_back(juxing(lbX[i], lbY[i], rtX[i], rtY[i])); vector<int> XX; for (int i = 0; i < n; i++) { XX.push_back(lbX[i]); XX.push_back(rtX[i]); } vector<int> YY; for (int i = 0; i < n; i++) { YY.push_back(lbY[i]); YY.push_back(rtY[i]); } int count = 0, ret = 0; for (int i = 0; i < XX.size(); i++) { for (int j = 0; j < YY.size(); j++) { for (int k = 0; k < AllJuXing.size(); k++) { if (XX[i] >= AllJuXing[k].lb_x && XX[i] < AllJuXing[k].rt_x && YY[j] >= AllJuXing[k].lb_y && YY[j] < AllJuXing[k].rt_y) count ++; } ret = max(ret, count); count = 0; } } cout<<ret; return 0; }