题目描述:
给定一组坐标点集合,当其中的x点使得集合p中的所有的点均不在x的右上方时(横纵坐标均大于x的点)称为最大点,找出点集合中所有的最大点。同时按X有小到大的顺序输出点集合
解析:
该题意就是要找边界点,思路就是对点集合按x进行排序, 从x最大的点进行开始进行遍历,当Y的值逐渐变大时则满足条件,即呈阶梯状。
var P =[];
var count = parseInt(read_line());
var line ;
while (count--) {
line = read_line();
line=line.split(" ");
P.push({
x:parseInt(line[0]),
y:parseInt(line[1])
});
}
function findMax(P){
var res=[];
P.sort(function(a,b){
return b.x - a.x;
})
var maxY = P[0].y;
for(var i =0;i<P.length;i++){
if(P[i].y>=maxY){
res.push([P[i].x,P[i].y]);
maxY = P[i].y;
}
}
return res;
}
var result = findMax(P);
/*var result = findMax([{x:1,y:2},{x:5,y:3},{x:4,y:6},{x:7,y:5},{x:9,y:0}]);*/
/*var result = findMax([{x:1,y:2},{x:3,y:1}]);*/
for(var i =result.length -1;i>=0;i--){
print((result[i][0]+" "+result[i][1]))
}
当然这题还有优化算法,那就是利用Y排序找X递增的,道理一样,只是题目要求按照X从小到达输出,如果按Y排序找到点就可以直接输出,不需要最后的一个循环:
var P =[];
var count = parseInt(read_line());
var line ;
while (count--) {
line = read_line();
line=line.split(" ");
P.push({
x:parseInt(line[0]),
y:parseInt(line[1])
});
}
function findMax(P){
var res=[];
P.sort(function(a,b){
return b.y - a.y;
})
var maxX = P[0].x;
for(var i =0;i<P.length;i++){
if(P[i].x>=maxX){
print(P[i].x+" "+P[i].y);
maxY = P[i].y;
}
}
}
findMax(P);
/*var result = findMax([{x:1,y:2},{x:5,y:3},{x:4,y:6},{x:7,y:5},{x:9,y:0}]);*/
/*var result = findMax([{x:1,y:2},{x:3,y:1}]);*/