効果の対象に
海岸には無限の直線であると仮定します。土地の海岸側には、海の反対側にあります。各島は、海辺のロケーションに位置しています。さらに、任意のレーダ装置のみ距離dを覆うことができる海岸沿いにあり、そしてそれらの間の最大距離がDである場合、したがって、装置の半径は、海島で覆われていてもよいです。
我々は、デカルト座標系をX軸慣性運動として定義される使用します。x軸方向、土地のx軸方向側の海側。海での各島の位置を考えると、レーダ装置により走行距離を決定するために、あなたのタスクは、すべての島をカバーするレーダ装置の最小数を見つけるためのプログラムを書くことです。島の位置は、そのx-y座標で表されることに留意されたいです。
エントリー
入力には、いくつかのテストケースで構成されています。それぞれの場合の最初の行は、海洋の島の数であり、nは二つの整数のn(1 <= N <= 1000)およびDを含み、Dは、レーダー装置カバーからの距離です。n行続いて、構成する各ラインは、二つの位置、各島の座標の整数を表します。次に例を分離するために空白行。
入力はnilを含む行で終了しました
アイデア解析
:どうやら問題は、制約の範囲持つようにバインドされている彼のレーダーをカバーするために、島のkに対して、貪欲である
D、島のx軸側を、あなたは、x軸は、その管轄の範囲で計算することができ、おそらく中心として、独自ですx軸との交点を中心とする円の半径として[I]、R [I Lです ]。
問題は、その後に変換されます。
これは、各セクションが少なくとも1つの点を含むように、最小のx軸の点を配置し、n個の間隔を与えます。
その後、それは最後のデバイスの座標を持つ小から大へ、左点範囲は、POSのレコード、POS初期の負の無限大に置かれている古典的な貪欲、プレスあります。
蓄積に現在のポイントは、I、POS(POS Iないカバー)左部よりも大きい場合には、各間隔について、答え、その結果pos = R[i]
(iは極端な位置を覆うように配置された)、またはのでpos = min(R[i],pos)
(場合、この状態は処理部に含まれている)
、青色などライン部、我々は赤い点の判断後のposの位置に注意を払って、我々は右端のposに赤い点を入れ、その後、黒のポイントを決定し、この時点で私たちの最善の戦略は、明らかに、最も右のPOS黒点の上に置かれています側、これだけpos = min(R[i],pos)
。
2 5
-3 4
-6 3
4 5
-5 3
-3 5
2 3
3 3
20 8
-20 7
-18 6
-5 8
-21 8
-15 7
-17 5
-1 5
-2 3
-9 6
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 7
9 6
10 5
0 0
2 3
0 2
2 3
2 3
0 2
1 3
3 3
1 2
-3 2
2 4
8 5
2 4
-4 4
-3 3
-3 1
-3 0
-1 0
0 5
6 0
3 0
1 2
-3 1
2 1
3 2
1 2
-3 1
2 1
1 2
0 2
2 3
0 2
2 3
4 -5
4 3
4 3
2 3
6 -9
3 -3
1 2
-3 2
2 1
6 2
1 2
1 2
1 2
-3 1
2 1
0 0
1 2
0 2
2 3
0 2
1 3
3 10
1 10
2 3
4 5
3 5
1 10
2 3
4 5
4 7
1 10
2 3
4 5
0 0
3 9
1 10
2 3
4 5
0 0
================结果
Case 1: 1
Case 2: 2
Case 3: 4
Case 4: 1
Case 5: 1
Case 6: -1
Case 7: 3
Case 8: -1
Case 9: 2
Case 10: 1
Case 11: 1
Case 12: -1
Case 13: -1
Case 14: 2
Case 15: 1
Case 16: 1
Case 17: 1
Case 18: -1
Case 19: -1
Case 20: -1
挥着翅膀的鳖 献上。。。
d<=0不需要判断
y<=0 不需要判断
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
#define MAX 1005
#define inf 0x7fffffff
int n, d, k = 1;
struct land {
double l, r;
land(double a = 0, double b = 0) { l = a, r = b; }
bool operator<(land ll) {
if (ll.l == l)return r < ll.r;
else return l < ll.l;
}
void set(double x, double y) {
double dis = sqrt(d*d - y * y);
l = x - dis, r = x + dis;
}
}arr[MAX];
int main() {
while (cin >> n >> d && n + d > 0) {
int sign = 1;
for (int i = 0; i < n; i++) {
int x, y; cin >> x >> y;
arr[i].set(x, y);
if (y > d)sign = 0;
}
printf("Case %d: ", k++);
if (!sign || d < 0) {
cout << -1 << endl; continue;
}
sort(arr, arr + n);
int cnt = 0;double pos = -inf;
for (int i = 0; i < n; i++) {
if (pos < arr[i].l) {//pos无法满足当前海岛的左端点约束
cnt++;
pos = arr[i].r;
}
else pos = min(pos, arr[i].r);
}
cout << cnt << endl;
}
}