題目描述:
給定一組座標點集合,當其中的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}]);*/