【編程練習】點集運算

時間限制: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章