雷達裝置【貪心】
阿新 • • 發佈:2021-01-04
技術標籤:貪心;暴力;模擬
>Link
ybtoj雷達裝置
>解題思路
數學知識可求,一般的座標點可以夠到的符合條件的雷達,在x軸上是一段有左右端點(
l
、
r
l、r
l、r)的區間,我們把這
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;
}