1328Radar Installation: gourmande + + puits enregistrement d'un ensemble de données échantillon

Sous réserve de l'effet

On suppose côte est en ligne droite infinie. Du côté de la côte de la terre, de l'autre côté de l'océan. Chaque île est située dans un endroit en bord de mer. En outre, tout dispositif radar est situé sur la côte ne peut couvrir une distance d, et par conséquent, si la distance maximale entre eux est d, peut être couvert le rayon de l'appareil avec une île de la mer.

Nous utilisons le système de coordonnées cartésiennes est défini comme étant l'axe des x mouvement d'inertie. côté océan de la direction d'axe x, la direction d'axe x côté de la terre. Compte tenu de la position de chaque île dans l'océan, et de déterminer la distance parcourue par le dispositif radar, votre tâche est d'écrire un programme pour trouver le nombre minimal de dispositif radar couvrant toute l'île. On notera que la position de l'île représentée par ses coordonnées xy.

Insérer ici l'image Description

entrée

Entrée se compose de plusieurs cas de test. La première ligne dans chaque cas comprend deux entiers n (1 <= n <= 1000) et d, où n est le nombre d'îlots dans l'océan, d est la distance entre les couvercles de l'appareil radar. Suivi par n lignes, chaque ligne comprenant représente un nombre entier de deux coordonnées de position de chaque îlot. Ensuite, une ligne blanche pour séparer les cas.

Entrée terminée par une ligne contenant le nil

analyse des idées

Apparemment , le problème est un gourmand, un k île, pour couvrir son radar est lié à une série de restrictions:
Insérer ici l'image Description
le côté axe x de l'île, vous pouvez calculer l'axe x est la portée de sa compétence, est probablement son propre comme centre, d comme rayon du cercle autour de l'intersection avec l'axe des x est le l [i], R [i ].

La question est ensuite transformé en:

Il donne les intervalles de n, en plaçant le point de minimum axe x, de telle sorte que chaque section comprend au moins un point.

Ensuite, c'est un classique gourmand, appuyez sur la plage de point gauche de petite à grande, avec les coordonnées du dernier appareil a été placé dans le dossier de pos, pos infinity négatif initial.

Ensuite , pour chaque intervalle, si le point courant est supérieur à la pos i section gauche (pos i pas de couverture), la réponse à l'accumulation, de sorte que pos = R[i](i placé pour couvrir la position extrême), ou si pos = min(R[i],pos)(dans le cas de cette condition est inclus dans la section de traitement)
Insérer ici l'image Description
comme le bleu partie de la ligne, nous portons une attention à la position pos après le jugement du point rouge, nous avons mis un point rouge sur pos l'extrême droite, puis déterminer le point noir, notre meilleure stratégie à ce moment est évidemment mis sur les plus à droite pos points noirs côté, donc seulement 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;
	}
}
Publié 186 articles originaux · Praise gagné 13 · vues 9298

Je suppose que tu aimes

Origine blog.csdn.net/csyifanZhang/article/details/105252544
conseillé
Classement