用最少的灯照亮所有岛屿

时间:2015-09-05 08:54:53

标签: algorithm

有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.

1 个答案:

答案 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

低于java

中的完整工作代码

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");


            }


            }

        }

    }

}