ZJ11. 编程题1
描述
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
输出:
4 6 7 5 9 0
C++ 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2021-06-19
#include <bits/stdc++.h> using namespace std; struct node{ int x; int y; }; bool cmp(node n1,node n2){ return n1.y>n2.y; } node mynode[500002]; int main(int argc,char** argv){ int n; ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(0); while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++) scanf("%d %d",&mynode[i].x,&mynode[i].y); sort(mynode,mynode+n,cmp); int mm=-1; for(int i=0;i<n;i++){ if(mynode[i].x>mm) { mm=mynode[i].x; printf("%d %d\n",mynode[i].x,mynode[i].y); } } } }
C++ 解法, 执行用时: 3ms, 内存消耗: 376KB, 提交时间: 2021-07-13
#include<iostream> #include<vector> #include<algorithm> #include<stack> using namespace std; void findboard(int N, vector<vector<int>> points, vector<vector<int>> &result) { int cur_max=points[N-1][1]; for(int i=N-1;i>=0;i--){ if(points[i][1]>=cur_max){ result.push_back(points[i]); cur_max=points[i][1]; } } } bool cmp(vector<int> a, vector<int> b) { if (a[0] == b[0]) return a[1]<b[1]; return a[0]<b[0]; } int main() { int N; cin >> N; vector<vector<int>> points(N, vector<int>(2)); for (int i = 0; i<N; i++) { int x, y; cin >> x >> y; points[i][0] = x; points[i][1] = y; } sort(points.begin(), points.end(), cmp); vector<vector<int>> result; findboard(N, points, result); sort(result.begin(), result.end(), cmp); for (int i = 0; i < result.size(); i++) { std::cout<<result[i][0] << " " << result[i][1] << endl; } }
C++ 解法, 执行用时: 3ms, 内存消耗: 380KB, 提交时间: 2021-07-12
#include <iostream> using namespace std; int main() { int n; cin>>n; int a[n][2] ; for (int i = 0; i <n; i++) { cin>>a[i][0]>>a[i][1]; } for(int i = 0;i<n;i++){ int count = 0; for(int j = 0;j<n;j++){ if(a[j][0]>a[i][0]&&a[j][1]>a[i][1]){ count++; break; } } if(count == 0){ cout<<a[i][0]<<"\t"<<a[i][1]<<endl; } } return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 400KB, 提交时间: 2021-07-19
#include<stdio.h> #include<algorithm> #include<iostream> using namespace std; struct node { int x; int y; }; bool compare(node a,node b) { return a.y>b.y ; } struct node p[500001]; int main() { int n; scanf("%d",&n); if(n>500000) { return 0; } for(int i=0;i<n;i++) { scanf("%d %d",&p[i].x,p[i].y); } //按y从大到小排列 sort(p,p+n,compare); int x1=0; for(int i=0;i<n;i++) { if(p[i].x>=x1) { printf("%d %d\n",&p[i].x,&p[i].y); x1=p[i].x; } } return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 504KB, 提交时间: 2021-06-27
#include<iostream> using namespace std; bool cmp(int x1,int y1,int x2,int y2) { if(x2>=x1&&y2>=y1) { return true; } return false; } int main() { int n; cin>>n; int x=0,y=0; while(n--) { int tempx,tempy; cin>>tempx>>tempy; if(cmp(x,y,tempx,tempy)) { x=tempx; y=tempy; } } return 0; }