1. 程式人生 > 其它 >雷達裝置【貪心】

雷達裝置【貪心】

技術標籤:貪心;暴力;模擬

>Link

ybtoj雷達裝置


>解題思路

數學知識可求,一般的座標點可以夠到的符合條件的雷達,在x軸上是一段有左右端點( l 、 r l、r lr)的區間,我們把這 n n n個區間存下
這樣就轉換成求最少用多少個點可以夠到所有的區間了

我們把這 n n n個區間按照 r r r端點從小到大排,每次記錄上一個雷達的位置,如果雷達在當前區間內,就使用這個雷達,否則就在 r r r端點建立一個新雷達。這樣可以使一個雷達夠到的區間最多,也就是在重合最厚的部分建雷達。


>程式碼

#include <iostream>
#include <
cstdio> #include <cstring> #include <algorithm> #include <cmath> #define db double #define N 1010 using namespace std; struct node { int x, y; db l, r; } a[N]; int n, d, ans; db p; bool cmp (node aa, node bb) { if (aa.r != bb.r) return aa.r < bb.r; return aa.l < bb.l; }
int main() { scanf ("%d%d", &n, &d); for (int i = 1; i <= n; i++) { scanf ("%d%d", &a[i].x, &a[i].y); a[i].l = a[i].x - (db)sqrt (d * d - a[i].y * a[i].y); a[i].r = a[i].x + (db)sqrt (d * d - a[i].y * a[i].y); } for (int i = 1; i <= n; i++) if
(d < abs (a[i].y)) {printf ("-1"); return 0;} sort (a + 1, a + 1 + n, cmp); ans = 1, p = a[1].r; for (int i = 2; i <= n; i++) { if (a[i].l <= p && p <= a[i].r) continue; ans++; p = a[i].r; } printf ("%d", ans); return 0; }