nの線分(1次元)の同じ長さの座標が与えられています。これらの線分の最小数を見つけ出す必要があります。これは不可能であることがわかります。より大きい線をカバーする線分の最小数
より大きい行は、から始まり、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);
そしてここでは、次の線分を取得し、私のヘルパーメソッドは次のとおりです。
int getNextSegment(int current) {
int i = current;
while (segments[i] <= segments[current] + 2* D)
i++;
return i-1;
}
私のアルゴリズムが正しく前述の出力を生成しますが、いくつかのバグは私のコードと私にはまだあります私のプログラムが失敗したテストケースを見つけることができませんでした。あなたは何を修正するべきだと思いますか?
あなたはバグがもう少し説明することはできますか? "私のコードのいくつかのバグ"はあまりにも曖昧です。 – Jamie
競争力のあるプログラミングを行っている場合は、システムがソリューションを受け入れないためにコードが間違っていることを知っているが、問題の原因を正確に把握していない場合があります。提供されたテストケースでは、あなたのプログラムは完璧に動作するからです。 – gdrt
これは、貪欲なアルゴが正しい答えを出すことが保証されている問題ではないと思います。 –