1. 程式人生 > >矩形重疊

矩形重疊

最大值 int pan bits 計算 nbsp namespace 最大 OS

題目:

平面內有n個矩形, 第i個矩形的左下角坐標為, 右上角坐標為。
如果兩個或者多個矩形有公共區域則認為它們是相互重疊的(不考慮邊界和角落)。
請你計算出平面內重疊矩形數量最多的地方,有多少個矩形相互重疊。

輸入描述:

輸入包括五行。
第一行包括一個整數n, 表示矩形的個數。
第二行包括n個整數,表示左下角的橫坐標。
第三行包括n個整數,表示左下角的縱坐標。
第四行包括n個整數,表示右上角的橫坐標。
第五行包括n個整數,表示右上角的縱坐標。

輸出描述:

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

樣例:

in:
2
0 90
0 90
100 200
100 200

out:
2

將n個矩形輪流作為被覆蓋區域,每次被覆蓋則更新區域,n次後求出最大值即可。

AC代碼:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 struct node{
 5     int x1,y1,x2,y2;
 6     bool operator < (const node&node1) const{
 7         if(x1!=node1.x1){
 8             return
x1<node1.x1; 9 } 10 if(y1!=node1.y1){ 11 return y1<node1.y1; 12 } 13 if(x2!=node1.x2){ 14 return x2<node1.x2; 15 } 16 else{ 17 return y2<node1.y2; 18 } 19 } 20 }a[60]; 21 22 int main(){
23 int n; 24 cin>>n; 25 for(int i=0;i<n;i++){ 26 cin>>a[i].x1; 27 } 28 for(int i=0;i<n;i++){ 29 cin>>a[i].y1; 30 } 31 for(int i=0;i<n;i++){ 32 cin>>a[i].x2; 33 } 34 for(int i=0;i<n;i++){ 35 cin>>a[i].y2; 36 } 37 sort(a,a+n); 38 int ans=0; 39 for(int i=0;i<n;i++){ 40 int cnt=0,x1=a[i].x1,y1=a[i].y1,x2=a[i].x2,y2=a[i].y2; 41 for(int j=0;j<n;j++){ 42 if(a[j].x1<x2&&a[j].y1<y2&&a[j].x2>x1&&a[j].y2>y1){ 43 x1=max(x1,a[j].x1); 44 y1=max(y1,a[j].y1); 45 x2=min(x2,a[j].x2); 46 y2=min(y2,a[j].y2); 47 cnt++; 48 } 49 } 50 ans=max(cnt,ans); 51 } 52 cout<<ans<<endl; 53 return 0; 54 }

矩形重疊