ZJ13. 最大点集
描述
P为给定的二维平面整数点集。定义P中某点x,如果x满足P中任意点都不在x的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复,坐标轴范围在[0, 1e9]内)
请实现代码找到集合P中的所有”最大“点的集合并输出。
输入描述
第一行输入点集的个数N, 接下来N行,每行两个数字代表点的X轴和Y轴。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++ 解法, 执行用时: 81ms, 内存消耗: 3960KB, 提交时间: 2022-04-26
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<queue> using namespace std; struct point { int x,y; bool operator<(const point&a) const { return y>a.y; } }; int n; point a[500005]; int read() { int ret=0,base=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') base=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { ret=ret*10+ch-'0'; ch=getchar(); } return ret*base; } inline void print(point x) { printf("%d %d\n",x.x,x.y); } int main() { n=read(); for(int i=1;i<=n;i++) { a[i].x=read(); a[i].y=read(); } sort(a+1,a+1+n); print(a[1]); for(int i=2,last=a[1].x;i<=n;i++) { if(a[i].x>=last) { print(a[i]); last=a[i].x; } } return 0; }
C++ 解法, 执行用时: 104ms, 内存消耗: 3960KB, 提交时间: 2020-07-06
#include <cstdio> #include <iostream> #include <algorithm> #define maxn 1000007 using namespace std; int n; struct pt { int x, y; } a[maxn]; bool cmp(pt A, pt B) { return A.x > B.x; } int ansx[maxn], ansy[maxn]; int ans_tot = 0; int main () { scanf("%d", &n); for (int i=0; i<n; i++) { scanf("%d%d", &a[i].x, &a[i].y); } sort(a, a + n, cmp); int max_height = -1; for (int i=0; i<n; i++) { if (a[i].y > max_height) { max_height = a[i].y; ansx[ans_tot] = a[i].x; ansy[ans_tot] = a[i].y; ans_tot++; } } for (int i=ans_tot - 1; i>=0; i--) { printf("%d %d\n", ansx[i], ansy[i]); } return 0; }
C++ 解法, 执行用时: 114ms, 内存消耗: 4044KB, 提交时间: 2021-08-04
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Node { int x, y; bool operator<(const Node &node) const { return y>node.y; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin >> n; vector<Node> v(n); for(int i=0;i<n;i++) cin >> v[i].x >> v[i].y; sort(v.begin(), v.end()); int minx=0, ret=0; for (int i=0;i<n;i++) { if (v[i].x>minx) { ret++; minx = v[i].x; cout << v[i].x << " " << v[i].y << endl; } } }
C++ 解法, 执行用时: 115ms, 内存消耗: 4080KB, 提交时间: 2021-10-07
#include <bits/stdc++.h> using namespace std; struct P{ int x, y; bool operator < ( P &p) { return y > p.y; } }; int main(){ int n, x, y, Max=0; scanf("%d", &n); P p[n]; for(int i=0;i<n;i++) scanf("%d%d", &p[i].x, &p[i].y); sort(p, p+n); for(int i=0;i<n;i++){ if(p[i].x > Max){ Max = p[i].x; printf("%d %d\n", p[i].x, p[i].y); } } return 0; }
C++ 解法, 执行用时: 117ms, 内存消耗: 4128KB, 提交时间: 2021-02-19
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define pii pair<int, int> #define pll pair<ll, ll> #define mp make_pair #define faster_cin_cout ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(0) #define maxn 500001 pii points[maxn]; template <typename T> inline void read(T &x) {char ch=getchar(); int f=1; x=0; while(!isdigit(ch)){if(ch=='-')f *= -1; ch=getchar();} while(isdigit(ch)) {x = (x<<1) + (x<<3) + (ch^48); ch=getchar();} x*=f;} ll qpow(ll x, ll y) { ll a=1, b=x; while(y){if(y&0x1) a*=b; b*=b; y>>=1;} return a;} int main(void) { #ifndef ONLINE_JUDGE ifstream cin("in.txt"); #endif //faster_cin_cout; int n, xpos = -1; read(n); for(int i = 1; i <= n; i++) read(points[i].first), read(points[i].second); sort(points+1, points+n+1, [](const pii& l, const pii& r){return l.second>r.second;}); for(int i = 1; i <= n; i++) { if(points[i].first > xpos) { xpos = points[i].first; printf("%d %d\n", points[i].first, points[i].second); } } return 0; }