编程题练习-点集运算
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; }
相关文章推荐
- 基础练习 复数运算
- 异或运算在算法编程题中的应用
- 【慢慢学算法】:位运算练习
- 20171223Java基础学习——编程题练习<黄金分割比>
- 第14周 拓展练习(四)矩阵运算
- Java中循环运算的小练习
- 网易2017校招内推笔试练习卷编程题2--出专辑
- 20172332『Java程序设计』课程结对编程练习_四则运算第二周阶段总结
- 课堂练习——随机运算2设计思想
- 课堂练习之扩展每天30道四则运算题----思路
- 课堂练习之四则运算加强版
- 【Weiss】【第03章】练习3.9:大整数运算包
- 运算符优先级练习
- 【ACM】ACM练习——大数运算求高精度幂
- Java编程题练习2017-02-15
- 百度外卖编程题练习笔记
- 程序设计实习2016推荐练习3 硬币(dp+数学/位运算压位)
- 49.分治算法练习: 1497 取余运算
- C语言小试牛刀两个初级程序练习------1到100的加法运算,两个数大小的比较
- python练习程序(运算,math,格式化)