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> using namespace std; const int maxn=5e5+5; struct point { int x; int y; }p[maxn],ans[maxn]; bool cmpMaxtoMin(point a,point b) { if(a.x==b.x) return a.y>b.y; return a.x>b.x; } bool cmpMintoMax(point a,point b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d%d",&p[i].x,&p[i].y); sort(p+1,p+1+n,cmpMaxtoMin); int len=0,max_y=-1; for(int i=1;i<=n;++i) if(p[i].y>max_y) ans[len++]=p[i],max_y=p[i].y; sort(ans,ans+len,cmpMintoMax); for(int i=0;i<len;++i) printf("%d %d\n",ans[i].x,ans[i].y); return 0; }
cnt =int(input()) every =[] result =[] for i in range(cnt): num =[int(x) for x in input().split()] every.append(num) every.sort(key=lambda t:t[0]) maxY =-1 for i in reversed(range(len(every))): if every[i][1] > maxY: result.append(every[i]) maxY =every[i][1] for i in reversed(range(len(result))): print(result[i][0], result[i][1])算法和热评第一的大佬一样的……70% 超时或者80%超内存交替出现……有没有大佬救救我
N=eval(input()) xy=[] for i in range(N): x,y=map(int,input().split()) xy.append((x,y)) g=[x for x in xy] for i in range(len(xy)): a,b=xy[i] for j in range(len(xy)): if xy[j][0] > a and xy[j][1]>b: g.remove((a,b)) break b=sorted(g,key=lambda k: k[1],reverse=True) for i in range(len(b)): print(b[i][0],b[i][1])这个网站上的有问题,亲自实践无论是他给出的5个坐标,还是10个坐标,我写的程序都没有错误,但是他却提示结果判断错误
#include<iostream> #include<algorithm> using namespace std; struct point{ int x, y; }; bool cmp(point a, point b) { return a.x>b.x; } int main() { int N; cin>>N; point p[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, cmp); int len = 1; int curY = p[0].y; for(int i=1; i<N; ++i) { if(p[i].y>curY) { curY = p[i].y; p[len].x = p[i].x; p[len].y = p[i].y; ++len; } } for(int i=len-1; i>=0; --i) printf("%d %d\n", p[i].x, p[i].y); return 0; } 使用cin cout时间运行通不过
n = int(input()) points = [] for _ in range(n): points.append(list(map(int, input().split()))) points.sort(key=lambda x: x[0]) # 计算从i~n-1的数据点中纵坐标最大的值 maxY = [0]*n maxY[n - 1] = points[n - 1][1] for i in range(n - 2, -1, -1): maxY[i] = max(points[i][1], maxY[i + 1]) # 求最大点 for i in range(n - 1): if points[i][1] > maxY[i + 1]: print(str(points[i][0]) + " " + str(points[i][1])) # 横坐标最大的点一定是“最大的”点 print(str(points[n - 1][0]) + " " + str(points[n - 1][1]))
70%超时。。求大佬们提意见~~啥意见都行
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int num = Integer.valueOf(scanner.nextLine()); Point[] points = new Point[num]; List maxPoints = new ArrayList(); String[] line; for (int i = 0; i < num; i++) { line = scanner.nextLine().trim().split(" "); points[i] = new Point(Integer.valueOf(line[0]), Integer.valueOf(line[1])); } Arrays.sort(points); maxPoints.add(points[num - 1]); int maxY = points[num - 1].y; for (int i = num - 2; i >= 0; i--) { if (points[i].y >= maxY) { maxPoints.add(points[i]); maxY = points[i].y; } } Collections.reverse(maxPoints); maxPoints.forEach(System.out::println); } static class Point implements Comparator<Point> { int x; int y; public Point(int x, int y) { this.x = x; this.y = y; } [@Override](/profile/992988) public int compareTo(Point o) { return Integer.compare(this.x, o.x); } [@Override](/profile/992988) public String toString() { return x + " " + y; } } }
if __name__ == "__main__": n = int(input()) a = [] for _ in range(n): a.append(list(map(int,input().split()))) a.sort(key=lambda x: x[0]) j = len(a) - 2 tmpy = a[-1][1] for i in range(len(a) - 1, -1, -1): if tmpy < a[i][1]: tmpy = a[i][1] a[j] = a[i] j -= 1 for k in range(j + 1, len(a)): print(a[k][0], a[k][1])通过80%,在原来的数组里修改,想不通为啥还是爆内存,怀疑这个python有问题,欢迎大佬指正
分析:
不能完全 AC的原因:
尽量使用 scanf/printf函数, 效率要比 cin/cout高
#include
using namespace std;
#define nullptr NULL
struct Point {
int x;
int y;
};
// 比较器, 按 X降序
bool cmp(const Point a, const Point b) {
return a.x > b.x;
}
int main()
{
int n;
cin >> n;
Point point[n];
int x, y;
for(int i = 0; i < n; i++) {
scanf("%d%d", &x, &y);
point[i].x = x;
point[i].y = y;
}
//排序
sort(point, point + n, cmp);
// 找出最大点
int len = 1;
int curY = point[0].y;
for(int i = 1; i < n; i++) {
if(point[i].y > curY) { // 这里取不取等都可以 AC
curY = point[i].y;
point[len].x = point[i].x;
point[len].y = point[i].y;
len++;
}
}
for(int i = len - 1; i >= 0; i--) {
printf("%d %d\n", point[i].x, point[i].y);
}
return 0;
}
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int[] keyArr = new int[N]; HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>(); for (int i = 0; i < N; i++) { int x = sc.nextInt(); int y = sc.nextInt(); keyArr[i] = x; hashMap.put(x, y); } Arrays.sort(keyArr); ArrayList<Integer> ans = new ArrayList<>(); //key等价于x,value等价于y int maxKey = keyArr[N - 1]; //将x排好序后,那么x最大的一定是“最大点”(记作A) int maxValue = hashMap.get(maxKey); ans.add(maxKey); for (int i = N - 2; i >= 0; i--) { //从倒数第二个开始,如果他想成为“最大点”,则现在存在的“最大点”A不能在它的右上方,那么他只需要y比“最大点”A大 int key = keyArr[i]; int value = hashMap.get(key); if (value > maxValue) { ans.add(keyArr[i]); maxValue = value; } } for (int i = ans.size() - 1; i >= 0; i--) { int key = ans.get(i); System.out.println(key + " " + hashMap.get(key)); } sc.close(); } }
n = int(input()) listx=[] listy=[] for i in range(n): x,y=list(map(int, input().split(" "))) listx.append(x) listy.append(y) Z = zip(listx,listy) Z = sorted(Z) newx,newy=zip(*Z) newx=list(newx) newy=list(newy) for i in range(n): if newy[i]== max(newy[i:]): print(newx[i],newy[i])
#include<bits/stdc++.h> using namespace std; void searchForward(map<int,int> &points,map<int,int>::iterator &ub,int x, int y,vector<int> &remove,bool &insert){ map<int,int>::iterator it=ub; for(;it!=points.begin();it--){ if(x<it->first){ if(y<=it->second){ insert=false; break; } }else{//replace here if(it->second<=y){ remove.emplace_back(it->first); }else{ break; } } } if(x<it->first){ if(y<=it->second){ insert=false; return; } }else{//replace here if(it->second<=y){ remove.emplace_back(it->first); }else{ return; } } } void update(map<int,int> &points,int x, int y){ vector<int> remove; bool insert=true; map<int,int>::iterator ub=points.upper_bound(x); if(ub==points.end()){//x is the last if(y>=ub->second){ searchForward(points,ub,x,y,remove,insert); }else{ points[x]=y; return; } }else{ if(ub==points.begin()){//x is the first one if(y<=ub->second){return;}//do not insert x else{//directly insert x and skip other check points[x]=y; return; } }else{ searchForward(points,ub,x,y,remove,insert); } } if(insert){ points[x]=y; } for(vector<int>::iterator it=remove.begin();it!=remove.end();it++){ points.erase(*it); } } int main(){ int n,x,y; map<int,int> points; cin>>n; scanf("%d %d",&x,&y); points[x]=y; for(int i=0;i<n-1;i++){ scanf("%d %d",&x,&y); update(points,x,y); } for(map<int,int>::iterator it=points.begin();it!=points.end();it++){ printf("%d %d\n",it->first,it->second); } return 0; }
N=int(input()) i=0 X=[] Y=[] while i<N: a,b=input().split(" ") X.append(int(a)) Y.append(int(b)) i=i+1 datas=zip(X,Y) datass1=sorted(datas,key=lambda x:x[0]) datass2=zip(*datass1) X,Y = [list(x) for x in datass2] for i in range(0,N-1): if Y[i]==max(Y[i:N]): print(X[i],Y[i],end='\n') i=i+1 else: i=i+1 print(X[N-1],Y[N-1])
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Comparator; import java.util.PriorityQueue; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { int num=Reader.nextInt(); PriorityQueue<int[]> points=new PriorityQueue<>(new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o2[1]-o1[1]; } }); for (int i = 0; i < num; i++) { int x=Reader.nextInt(); int y=Reader.nextInt(); points.offer(new int[]{x,y}); } int[] p= points.poll(); int x=p[0]; int y=p[1]; PrintWriter out=new PrintWriter(System.out); out.println(x+" "+y); while (!points.isEmpty()){ p= points.poll(); if (p[0]>x){ x=p[0]; out.println(p[0]+" "+p[1]); } } out.flush(); } static class Reader { static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer tokenizer = new StringTokenizer(""); static String next() throws IOException { while (!tokenizer.hasMoreTokens()){ tokenizer=new StringTokenizer(reader.readLine()); } return tokenizer.nextToken(); } static int nextInt() throws IOException { return Integer.parseInt(next()); } } }
a =int(input()) l1 =[] # 记录原始 5 3 l2 =[] # 记录分割 ['5','3'] l3 =[] # T/F判断 # 初始化 fori inrange(a): l1.append(input()) l2.append(l1[i].split(' ')) l3.append(True) 查找最大值 fori in range(a): forj inl2[i+1:]: ifint(j[1])>=int(l2[i][1]): l3[i]=False break # 根据T 输出最大值 fori inrange(a): ifl3[i]: print(l1[i]) |