您的位置:首页 > 编程语言

编程题练习-点集运算

2019-07-12 20:32 1666 查看
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

时间限制: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
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: