時間限制:1秒
空間限制:32768K
P爲給定的二維平面整數點集。定義 P 中某點x,如果x滿足 P 中任意點都不在 x 的右上方區域內(橫縱座標都大於x),則稱其爲“最大的”。求出所有“最大的”點的集合。(所有點的橫座標和縱座標都不重複, 座標軸範圍在[0, 1e9) 內)
如下圖:實心點爲滿足條件的點的集合。請實現代碼找到集合 P 中的所有 ”最大“ 點的集合並輸出。
輸入描述:
第一行輸入點集的個數 N, 接下來 N 行,每行兩個數字代表點的 X 軸和 Y 軸。
對於 50%的數據, 1 <= N <= 10000;
對於 100%的數據, 1 <= N <= 500000;
輸出描述:
輸出“最大的” 點集合, 按照 X 軸從小到大的方式輸出,每行兩個數字分別代表點的 X 軸和 Y軸。
輸入例子1:
5
1 2
5 3
4 6
7 5
9 0
輸出例子1:
4 6
7 5
9 0
50%得分,時間複雜度沒有降下來
思路:通過結構體保存點的數據,一個結構體組用來存放所有數據,一個從來存放結果。
運算符重載修改>號,在比較中得出滿足條件的點。
此時要求按x遞增輸出,我們再寫一個cmp函數,修改結構體的比較規則,調用sort函數進行排序。
#include<iostream>
#include<algorithm>
using namespace std;
struct point
{
long long int x;
long long int y;
};
bool operator>(point p1,point p2)
{
if(p1.x>p2.x&&p1.y>p2.y)
return true;
else
return false;
}
bool cmp(point p1,point p2)
{
if(p1.x<=p2.x)
return true;
else return false;
}
point res[500001];
int main()
{
int N,i,j;
cin>>N;
point p[N];
for(i=0;i<N;++i)//讀入數據
{
cin>>p[i].x>>p[i].y;
}
int count=0;
for(i=0;i<N;++i)
{
for(j=0;j<N;++j)
if(p[j]>p[i])//有一個比他“大”的 他就不“最大的”
break;
if(j==N)//把“最大的數”都保存另一個結構體組中
{
res[count].x=p[i].x;
res[count].y=p[i].y;
count++;
}
}
sort(res,res+count,cmp);//對集合進行排序,按照自定義規則
for(int k=0;k<count;k++)
{
cout<<res[k].x<<" "<<res[k].y<<endl;
}
return 0;
}