Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 覆盖较大直线的最小线段数_Java_Algorithm_Greedy - Fatal编程技术网

Java 覆盖较大直线的最小线段数

Java 覆盖较大直线的最小线段数,java,algorithm,greedy,Java,Algorithm,Greedy,我得到了相同长度的n线段(一维)的坐标,我需要找到这些线段的最小数量,以完全覆盖较大的直线,或者发现这是不可能的 较大的线从0开始,在L结束。线段可以从范围[0-D,L-D]开始,并且所有线段都具有相同的长度2*D 例如,对于以下输入: 15 2 4 // L, n, D -2 7 // beginning coordinates of line segments 21 14 4 10 4 6 3 16 17 -1 2 14 11 12 8 5 1 9 9 3 -2 -1 4 0 5 -3

我得到了相同长度的n线段(一维)的坐标,我需要找到这些线段的最小数量,以完全覆盖较大的直线,或者发现这是不可能的

较大的线从0开始,在L结束。线段可以从范围[0-D,L-D]开始,并且所有线段都具有相同的长度2*D

例如,对于以下输入:

15 2 4 // L, n, D
-2 7  // beginning coordinates of line segments

21 14 4
10 4 6 3 16 17 -1 2 14 11 12 8 5 1

9 9 3
-2 -1 4 0 5 -3 6 3 1

14 12 5
-3 -2 7 5 3 -4 2 -5 0 8 9 6
有以下输出:

Case #1: impossible
Case #2: 3
Case #3: 2
Case #4: 2
为了解决这个问题,我使用贪婪算法,选择线段,使它们之间的交点最小。以下是我的java代码:

// read L, n, D
// read line segments to segments[] array
segments[n] = Integer.MAX_VALUE;
Arrays.sort(segments);
int current = -1;
for (int i = n-1; i >= 0; i--)
    if (segments[i] <= 0) {
        current = i;
        break;
    }
if (current == -1) {
    System.out.println("Case #" + k + ": impossible");
    continue;
}
int count = 1;
boolean poss = true;
for (int i = 0; i < L - 2* D;) {
    count++;
    int next = getNextSegment(current);
    if (next == current) {
        poss = false;
        break;
    }
    current = next;
    i = segments[current];
}
if (!poss)
    System.out.println("Case #" + k + ": impossible");
else
    System.out.println("Case #" + k + ": " + count);
//读L,n,D
//将线段读取到段[]数组
段[n]=整数.MAX_值;
数组。排序(段);
int电流=-1;
对于(int i=n-1;i>=0;i--)

如果(段[i]我成功编辑了您的解决方案,为所提供链接上列出的所有数据集生成了正确的输出。我的编辑如下:

Arrays.sort(segments);
int current = -1;
for (int i = n-1; i >= 0; i--) {
    if (segments[i]-D <= 0) {
        current = i;
        break;
    }
}
if (current == -1) {
   System.out.println("Case #" + k + ": impossible");
   continue;
}
int count = 1;
boolean poss = true;
for (int i = segments[current]; i < L-D;) {
    count++;
    int next = getNextSegment(current);
    if (next == current) {
        poss = false;
        break;
    }
    current = next;
    i = segments[current];
}
if (!poss)
    System.out.println("Case #" + k + ": impossible");
else
    System.out.println("Case #" + k + ": " + count);
  • 数组从大小
    n+1
    更改为大小
    n
    ,删除末尾的Integer.MAX_值条目

  • 更改了
    段[i]您能再描述一下错误吗?“我的代码中有一些错误”太模糊了。如果你做过竞争性编程,你会遇到这样的情况,你只知道你的代码是错误的,因为系统不接受你的解决方案,但你不知道到底是什么问题。因为在提供的测试用例中,你的程序运行得非常好。我不认为这是贪婪算法可以保证的问题需要给出正确答案。你能链接到原始问题吗?你得到WA或TLE吗?在线法官接受了解决方案。+1并接受我的回答,谢谢!解决方案中有一个小缺陷,即你开始从0开始迭代,尽管有时第一个选择的段已经>0。请参阅编辑。
    
    Arrays.sort(segments);
    int current = -1;
    for (int i = n-1; i >= 0; i--) {
        if (segments[i]-D <= 0) {
            current = i;
            break;
        }
    }
    if (current == -1) {
       System.out.println("Case #" + k + ": impossible");
       continue;
    }
    int count = 1;
    boolean poss = true;
    for (int i = segments[current]; i < L-D;) {
        count++;
        int next = getNextSegment(current);
        if (next == current) {
            poss = false;
            break;
        }
        current = next;
        i = segments[current];
    }
    if (!poss)
        System.out.println("Case #" + k + ": impossible");
    else
        System.out.println("Case #" + k + ": " + count);
    
    int getNextSegment(int current) {
        int i = current;
        while(i < segments.length && segments[i] <= segments[current] + 2 * D)
            i++;
        return i - 1;
    }