1328Radarインストール:どのように貪欲なサンプルデータのセットを記録+ +ピット

効果の対象に

海岸には無限の直線であると仮定します。土地の海岸側には、海の反対側にあります。各島は、海辺のロケーションに位置しています。さらに、任意のレーダ装置のみ距離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;
	}
}
公開された186元の記事 ウォン称賛13 ビュー9298

おすすめ

転載: blog.csdn.net/csyifanZhang/article/details/105252544
おすすめ