6.8-“最大點”-預排序

時間限制: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

現根據y值進行排序,然後比較比較當前點的x值與改點上面的所有點的最大x值,如果小於說明改點一定是最大點。
但是由於時間限制,只能過80%

#include<algorithm>
using namespace std;
struct loc
{
	int x;
	int y;
};
int cmp(const loc& a, const loc& b)
{
	return  a.y>b.y;
}
int main()
{
	int n;
	cin>>n;
	loc* a = new loc[n];
	for(int i=0;i<n;i++)
	{
		int xx,yy;
		cin>>xx>>yy;
		a[i].x=xx;
		a[i].y=yy;	
	} 
	sort(a,a+n,cmp);
	int maxx=-1;
	for(int i=0;i<n;i++)
	{
		if(a[i].y==a[i+1].y)
		{
			continue;
		}
		if(a[i].x> maxx)
		{
			cout<<a[i].x<<" "<<a[i].y<<endl;
			maxx=a[i].x;
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章