南沙C++信奧賽陳老師解一本通題 1230:尋找平面上的極大點

南沙区信奥赛陈老师發表於2024-11-04

【題目描述】

在一個平面上,如果有兩個點(x,y),(a,b),如果說(x,y)支配了(a,b),這是指x≥a,y≥b;

用圖形來看就是(a,b)坐落在以(x,y)為右上角的一個無限的區域內。

給定n個點的集合,一定存在若干個點,它們不會被集合中的任何一點所支配,這些點叫做極大值點。

程式設計找出所有的極大點,按照x座標由小到大,輸出極大點的座標。

本題規定:n不超過100,並且不考慮點的座標為負數的情況。

【輸入】

輸入包括兩行,第一行是正整數n,表示是點數,第二行包含n個點的座標,座標值都是整數,座標範圍從0到100,輸入資料中不存在座標相同的點。

【輸出】

按x軸座標最小到大的順序輸出所有極大點。

輸出格式為:(x1,y1),(x2,y2),...(xk,yk)(x1,y1),(x2,y2),...(xk,yk)。

注意:輸出的每個點之間有","分隔,最後一個點之後沒有",",少輸出和多輸出都會被判錯。

【輸入樣例】

5 
1 2 2 2 3 1 2 3 1 4

【輸出樣例】

(1,4),(2,3),(3,1)

#include <bits/stdc++.h>
using namespace std;
struct Node
{
	int x,y;
};
Node a[1001];
bool cmp(Node n1,Node n2)
{
	if(n1.x==n2.x)
		return n1.y<n2.y;	//除按X從小到大輸出,y也要從小到大輸出 
	else
		return n1.x<n2.x;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i].x>>a[i].y;
	sort(a+1,a+n+1,cmp);
	bool isfirst=true;
	for(int i=1;i<=n;i++)
	{
		bool flag=true;
		for(int j=i+1;j<=n;j++)
		{
			if(a[i].x<=a[j].x&&a[i].y<=a[j].y)	//被支配 如果i點的x,y均小於等於 j點 
			{
				flag=false;
				break;
			}
		}
		if(flag)
		{
			if(isfirst==false)
				cout<<",";
			else
				isfirst=false;
			cout<<"("<<a[i].x<<","<<a[i].y<<")";
		}
	}
	return 0;
}
南沙C++信奧賽陳老師解一本通題 1230:尋找平面上的極大點

相關文章