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
def main(): n = int(input()) point_list = [] max_num = [0,0] for _ in range(n): data = input().split() x, y = int(data[0]), int(data[1]) if x < max_num[0] and y < max_num[1]: continue if x > max_num[0] and y > max_num[1]: max_num = [x, y] point_list.append((x,y)) point_list.sort() result = [] max_y = 0 for i in range(len(point_list)-1, -1,-1): if point_list[i][1] >= max_y: max_y = point_list[i][1] result.append(point_list[i]) for i in range(len(result)-1, -1,-1): print(result[i][0], result[i][1]) if __name__ == "__main__": main()
import sys import math def takefirst(lis): return lis[0] lines = sys.stdin.readlines() raw = [] for line in lines: raw.append(list(line.strip().split())) raw = raw[1:] total = len(raw) result = [] for raw0 in raw: flag = 1 for raw1 in raw : if (raw1 == raw0): pass elif raw1[0] > raw0[0] and raw1[1] > raw0[1]: flag = 0 if flag == 1: result.append(raw0) result.sort(key=takefirst) for res in result: print(res[0] + ' ' + res[1])
对于任意一个点P,如果存在一个点,x大于它且y大于它,那么它就不能满足条件。也就是说,对于点P, 如果在集合中,找不到另一个点P`,使得P`的x轴,y轴都大于点P,则P点满足条件。 class Point(object): def __init__(self,x,y): self.x = x self.y = y def isLower(self,point): return self.x<point.x and self.y<point.y num = input() number = int(num) li = [] for i in range(number): inp = input() s = inp.split() p = Point(int(s[0]),int(s[1])) li.append(p) res = [] for p1 in li: temp = True for p2 in li: if p1.isLower(p2): temp = False break if temp: res.append(p1) for po in res: print ('%d %d'%(po.x,po.y)) (我觉得我的代码没问题。。。)