P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)
如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。
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轴。
5 1 2 5 3 4 6 7 5 9 0
4 6 7 5 9 0
#include<bits/stdc++.h>#define frp(i,a,b) for(int i = a; i <= b; i++)#define frpp(i,a,b) for(int i = a; i < b; i++)#define frd(i,a,b) for(int i = a; i >= b; i--)#define frdd(i,a,b) for(int i = a; i > b; i--)#define clr(a,b) memset(a,b,sizeof(a))#define pb push_back#define mp make_pair#define lb lower_bound#define ub upper_boundusingnamespacestd;typedeflonglonglint;structnod{intx,y;booloperator < (constnod & a)const{returnx < a.x;}}a[500050];intn;inlinevoidget_ready( ){scanf("%d", &n);frp(i,1,n) scanf("%d%d",&a[i].x,&a[i].y);}inlinevoidsolve( ){sort(a+1,a+n+1);stack<nod>qq;intres;frd(i,n,1){if(qq.empty()){qq.push(a[i]);res = a[i].y;}else{if(a[i].y>res){qq.push(a[i]);res = max(res,a[i].y);}}}while(!qq.empty()){nod xx = qq.top( );qq.pop( );printf("%d %d\n",xx.x,xx.y);}}intmain( ){get_ready( );solve( );return0;}
n = int(input()) points = [[int(j) for j in input().split()] for _ in range(n)] points.sort(key=lambda x: x[0]) index=-2 y = points[-1][1] for _ in range(n-1): if y >= points[index][1]: del points[index] else: y = points[index][1] index-=1 for i in range(len(points)): print('%d %d' % (points[i][0],points[i][1]))
#include<iostream> #include<vector> #include<string> #include<unordered_map> #include<stdio.h> #include<algorithm> #include<limits.h> using namespace std; struct Point { int x; int y; Point(int a, int b) :x(a), y(b) { } bool operator>(Point& other) { return x > other.x; } }; bool cmp(Point x1, Point x2) { return x1.x > x2.x; } vector<Point> maxPoint(vector<Point>& nums) { int size = nums.size(); vector<Point> ret; sort(nums.begin(), nums.end(), cmp); ret.push_back(nums[0]); int tempY = nums[0].y; for (int i = 1; i < size; i++) { if (nums[i].y > tempY) { ret.push_back(nums[i]); tempY = nums[i].y; } } return ret; } int main() { int n; cin >> n; vector<Point> nums(n, Point(0, 0)); vector<Point> ret; for (int i = 0; i < n; i++) { // 注: 这里使用cin 输入会导致超时,只能通过80%例子 //cin >> nums[i].x >> nums[i].y; scanf("%d %d\n", &nums[i].x, &nums[i].y); } ret = maxPoint(nums); for (int i = ret.size() - 1; i >= 0; i--) { cout << ret[i].x << " " << ret[i].y << endl; } return 0; }
if __name__ == "__main__": n = int(input()) point = [] for i in range(n): line = input() x, y = list(map(int, line.split())) point.append((x, y)) point.sort() last_height=point[-1][1] for i in range(n-2,-1,-1): if point[i][1]>last_height: last_height=point[i][1] else: del point[i] for i in point: print("%d %d"%(i[0],i[1]))80% 超时
import sys
n = int(sys.stdin.readline().strip())
point = []
for i in range(n):
point.append(list(map(int, sys.stdin.readline().strip().split())))
point.sort(key=lambda k:k[1],reverse=True)
res = []
res.append(point[0])
for i in range(1,len(point)):
if point[i][0] > res[-1][0]:
res.append(point[i])
else:
continue
res.sort(key=lambda k:k[0])
for i in res:
print i[0],i[1]
您的代码已保存
内存超限:您的程序使用了超过限制的内存
case通过率为80.00%
/* 思路解析: 题目要求我们需要输出的是,存在满足没有(x,y)同时大于他的点。 因此,通过分析可以知道,如果先将x按降序排序。那么我们每次只需要更新最大的y就好了。 因为,之后的出现的x不可能会比之前的大,那么满足输出的情况只要一种了, 就是之后的某个点的y比之前的大。 */#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
const int MAXN = 500000 + 10;
struct Point{
int x, y;
Point(){};
Point(int _x, int _y):
x(_x), y(_y) {};
bool operator < (const Point &rhs) const {
return x > rhs.x;
}
} p[MAXN];
/*
*
*
5
1 2
5 3
4 6
7 5
9 0
*/
int main(int argc, char* argv[])
{
int n;
while(~scanf("%d",&n)) {
int x, y;
for (int i = 0;i < n;++i) {
scanf("%d%d", &x, &y);
p[i].x = x;
p[i].y = y;
}
sort(p, p+n);
// for (int i = 0;i < n;++i) {
// cout << p[i].x <<" " << p[i].y << endl;
// }
stack<Point> s;
int maxy = -1;
for (int i = 0;i < n;++i) {
if (maxy <= p[i].y) {
maxy = p[i].y;
s.push(Point(p[i].x, p[i].y));
}
}
Point tmp;
while(!s.empty()) {
tmp = s.top();
s.pop();
printf("%d %d\n", tmp.x, tmp.y);
}
}
return 0;
}
本套试题AC代码在 https://github.com/ReyzalX/nowcoder 查看
#include <bits/stdc++.h>
using namespace std;
struct Point
{
int x, y;
};
Point points[500001];
int main()
{
int n;
cin >> n;
for (size_t i = 0; i < n; i++)
{
scanf("%d%d", &points[i].x, &points[i].y);
}
//按照y升序 x降序排列
sort(points, points + n,
[](Point & p1, Point & p2)
{
return p1.y == p2.y ? p1.x > p2.x : p1.y < p2.y;
});
printf("%d %d\n", points[n - 1].x, points[n - 1].y);
int maxx = points[n - 1].x;
for (int i = n - 2; i >= 0; i--)
{
if (points[i].x > maxx)
{
printf("%d %d\n", points[i].x, points[i].y);
maxx = points[i].x;
}
}
return 0;
}
N = int(input()) point_set = [] for _ in range(N): x, y = [int(x) for x in input().split()] point_set.append((x, y)) point_set.sort(key=lambda x: x[1]) point_set.reverse() max_x = float('-inf') for x, y in point_set: if x > max_x: print(x, y) max_x = x
from sys import stdin n =int(stdin.readline().strip()) data= [int(x) for x in stdin.readline().strip().split()] partsum=[0] for x in data: partsum.append( partsum[-1]+x ) def left_bound(data): left=[ 0 for i in range(n) ] for i,v in enumerate( data[1:],1): if v > data[i-1]: left[i]=i else: k = i-1 while k >= 0: if v < data[k]: k = left[k]-1 else : left[i] = left[k] if v == data[k] else k+1 break return left left = left_bound(data) right= left_bound(data[::-1])[::-1] right= [n-x for x in right ] res = max([ data[i]*(partsum[right[i]]-partsum[left[i]]) for i in range(n) ]) print(res)
import numpy as np p=[] n=int(input()) for i in range(n): a=list(map(int,input().split(' '))) p.append(a) p=np.array(p) indx=np.argmax(p,axis=0) #TODO 构造直线方程 x1=p[indx[0]][0] y1=p[indx[0]][1] x2=p[indx[1]][0] y2=p[indx[1]][1] a = y2-y1 b = x1-x2 c = x2*y1-x1*y2 for j in range(n): x=p[j][0] y=p[j][1] distance=a*x+b*y+c if distance>=0: print(p[j][0]+p[j][1])x轴最大值和y轴的最大值对应的坐标构造一条直线方程,将所有点代入到直线方程,大于0就满足。
#include<iostream> #include<vector> #include<algorithm> #include<stack> using namespace std; static bool cmp(const vector<int>& a,const vector<int>& b){ return a.front()>b.front(); } //该题减少时间复杂度的关键在于,按照x降序排列,那么只要记录前面这些点的最大y值maxy, //只要该点的y值比这个maxy大,那么就不存在x和y同时大于它的情况,而不需要一一比较 int main(){ int num; cin>>num; vector<vector<int>> nums(num,vector<int>(2)); for(int i=0;i<num;i++){ cin>>nums[i][0]>>nums[i][1]; } sort(nums.begin(),nums.end(),cmp); int maxy=-1; stack<int> s; for(int i=0;i<nums.size();i++){ if(nums[i][1]>maxy){ maxy=nums[i][1]; s.push(i); } } while(!s.empty()){ cout<<nums[s.top()][0]<<" "<<nums[s.top()][1]<<endl; s.pop(); } return 0; }
#include <iostream>#include <algorithm>#include <vector>using namespace std;int n;typedef struct point {long long x, y;} Point;vector<int> v;bool compPoint(Point p1, Point p2) {if(p1.x > p2.x) return true;if(p1.x == p2.x && p1.y > p2.y) return true;return false;}int main() {cin >> n;Point *p = new Point[n];for(int i = 0; i < n; i++) cin >> p[i].x >> p[i].y;sort(p, p + n, compPoint);long long max_y = -1;for(int i = 0; i < n; i++) {if(p[i].y >= max_y) {v.push_back(i);max_y = p[i].y;}}int L = v.size();for(int i = L - 1; i >= 0; i--) printf("%ld %ld\n", p[v[i]].x, p[v[i]].y);return 0;}
# import numpy as np n = int(input()) arr = [] for i in range(n): line = input().split(' ') line =[int(n) for n in line] arr.append(line) # sorted_arr = arr[np.argsort(arr[:, 0])] arr = sorted(arr,key = lambda x:x[0]) y_max = -1 i = len(arr)-1 res=[] while(i>0): # print(arr[i]) if(arr[i][1]>y_max): y_max = arr[i][1] res.append(arr[i]) i-=1 i = len(res)-1 while(i>=0): print(f"{res[i][0] } {res[i][1]}") i-=1 我这样理解,针对二维数组的第一维进行排序,然后利用res存放输出的点, 从后往前遍历二维数组arr,以次记录y的最大值。 因为x轴本来就是升序的,故当前的x坐标肯定大于下一个点的x坐标, 只需要比较当前轴的y值和记录的y最大值,只要y的最大值更新,就存放在res中, 然后逆序输出res。求大佬解答,这样为啥会有问题
import sys pos = [] for line in sys.stdin: a = line.split() if len(a) == 1: N = int(a[0]) else: pos.append((int(a[1]),int(a[0]))) pos.sort(reverse=True) pre_x = 0 for i in range(len(pos)): if pos[i][1] > pre_x: print(pos[i][1], pos[i][0]) pre_x = pos[i][1]运行超时通过案例7/10, 有没有老哥python 过了的