有N个岛,从1到N枚举。它们中的每一个都很小,我们可以将它们视为飞机上的点。我们得到了所有岛屿的笛卡尔坐标。 X轴指向东方,Y轴指向北方。
我们需要照亮所有岛屿。为此,我们可以在一些岛屿上放置灯塔。我们不能在任何一个岛屿上放置一个以上的灯塔。每个灯塔只能点亮4个象限中的一个:西北,东北,西南或东南。如果某个岛屿位于照明象限的边界,则它也被认为是照亮的。请注意,这意味着灯塔也会照亮它自己的岛屿。
现在我们需要找到照亮所有岛屿所需的尽可能少的灯塔,我们还需要告诉他们的配置 - 照明位置和象限。
示例:我们有5个岛屿,笛卡尔平面上的位置是:
0,0
1,0
2,0
0,-1
0,-2
在这里,答案是1,因为我们可以把它放在面向西南的第三岛上。我们也可以把它放在第一或第五岛上。
如何解决这个问题?请帮忙。
给出:
1 ≤ N ≤ 10^5
Absolute value of each coordinate doesn't exceed 10^9
No two given islands coincide.
答案 0 :(得分:-1)
男人这太简单了......将需要最多2个灯塔照亮所有岛屿...将这个问题分为两部分。 需要1个灯塔的第一部分&第二部分需要两个灯塔.. 对于第一部分,如果有任何这样的绳索存在,那么找到四个位置中的任何一个,如果有任何这样的绳索,那么应该放置一个灯塔照亮所有其他岛屿
如果不存在这样的坐标,则需要2个坐标 jus找到一个最小x和最大x的坐标,如果坐标最大x高于坐标,最小x,第一个灯塔应放在坐标上,最小x&第二个将位于坐标最大x(xordinate灯塔的方向,最小x将是NE& for max x SW)同样如果坐标max x低于cordinate with min x则第一个灯塔应放置在与min x方向坐标SE&第二个将位于坐标上,最大x方向NW
https://www.codechef.com/viewsolution/8104939
import java.util.LinkedList;
import java.util.Scanner;
import java.util.TreeSet;
class cordinate{
int x,y,index;
cordinate(int x,int y,int index){
this.x=x;
this.y=y;
this.index=index;
}
}
class add implements Comparable {
int x, y, Index;
add(int x, int y, int index) {
this.x = x;
this.y = y;
this.Index = index;
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 1;
}
}
class lighthouse {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t-- > 0) {
TreeSet<add> ts = new<add> TreeSet();
int n = sc.nextInt();
int minx, maxx, miny, maxy;
miny = minx = Integer.MAX_VALUE;
maxy = maxx = Integer.MIN_VALUE;
for (int i = 1; i <= n; i++) {
int x = sc.nextInt();
int y = sc.nextInt();
if (minx > x)
minx = x;
if (miny > y)
miny = y;
if (maxx < x)
maxx = x;
if (maxy < y)
maxy = y;
ts.add(new add(x, y, i));
}
// System.out.printf("minx =%d maxx=%d miny =%d maxy %d
",minx,maxx,miny,maxy);
boolean f = false;
for (add add : ts) {
int x = add.x;
int y = add.y;
int index = add.Index;
if (x == minx && y == miny) {
System.out.println(1);
System.out.println(index + " NE");
f = true;
break;
} else if (x == minx && y == maxy) {
System.out.println(1);
System.out.println(index + " SE");
f = true;
break;
} else if (x == maxx && y == miny) {
System.out.println(1);
System.out.println(index + " NW");
f = true;
break;
} else if (x == maxx && y == maxy) {
System.out.println(1);
System.out.println(index + " SW");
f = true;
break;
}
}
if (!f) {
LinkedList al= new LinkedList();
int minX,y1,maxX,y2 = 0;
minX=y1=0;
int in1,in2;
in1=in2=0;
for (add add : ts) {
int x = add.x;
int y = add.y;
int index = add.Index;
if(x==minx){
in1=index;
minX=x;
y1=y;
}
if(x==maxx){
in2=index;
maxX=x;
y2=y;
}
}
System.out.println(2);
if(y2>y1){
System.out.println(in1+" NE");
System.out.println(in2+" SW");
}
else{
System.out.println(in1+" SE");
System.out.println(in2+" NW");
}
}
}
}
}