2018網易計算機視覺筆試實習生程式設計題
阿新 • • 發佈:2019-02-08
平面內有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
【題目分析】:題目為判斷矩形的重疊個數,通過列舉的方式,可以得到結果複雜度為O(n^3),只要有一個點是包含關係即可。矩形一個點再另一個矩形內就可以滿足重疊。
#include<bits/stdc++.h> using namespace std; const int maxn = 55; int a1[maxn] , b1[maxn] ; int a2[maxn] , b2[maxn] ; set<int> xx, yy; int main(){ int n; scanf("%d", &n); for (int i = 0; i < n; i++){ scanf("%d", &a1[i]); xx.insert(a1[i]); } for (int i = 0; i < n; i++){ scanf("%d", &b1[i]); yy.insert(b1[i]); } for (int i = 0; i < n; i++){ scanf("%d", &a2[i]); xx.insert(a2[i]); } for (int i = 0; i<n; i++){ scanf("%d", &b2[i]); yy.insert(b2[i]); } int ans = 0; for (int x : xx){ for (int y : yy){ int cnt = 0; for (int i = 0; i<n; i++){ if (a1[i] <= x && b1[i] <= y && a2[i]>x &&b2[i]>y)cnt++; } ans = max(ans, cnt); } } printf("%d\n", ans); return 0; }