参考了下列链接中的情况1做出来的http://blog.csdn.net/chenguolinblog/article/details/7882316
基本思路:核心就是贪心算法。
(1)先把 以每个小岛i为圆心作圆后与x轴相交的得到的left,right存到对应的dis[i]数组中;
(2)然后按升序排好dis数组;
(3)设置一个新的变量tmp 与 dis数组进行比较。倘若tmp.right<dis[i].left
,则说明应该再新增一个雷达(注意:tmp只有满足在dis[i]左边的情况下才可能有上述条件成立),否则继续找下一个满足题意的情况,直至结束。
另外还需注意一下判错的条件d<0 || MAX>d
。
ps:需要算上最开始满足题意的第一个雷达,所以最后输出的答案是ans+1.
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#define N 1000
using namespace std;
typedef struct distance
{
float left, right;
}dd;
dd dis[N];
int cmp(dd a, dd b)
{
if (a.right < b.right) return 1;
return 0;
}
int main()
{
int n, d, xx, yy, vis[N];
int t = 1;
while (scanf("%d%d",&n,&d),n)
{
int MAX = 0, cnt = 0;
memset(dis, 0, sizeof(dis));
for (int i = 0;i < n;i++)
{
cin >> xx >> yy;
if (MAX < yy) MAX = yy;
if (1.0*d*d - 1.0*yy*yy < 0) continue;
else
{
float delta;
delta = (float)sqrt(1.0*d*d - 1.0*yy*yy);
dis[cnt].left = xx - delta;
dis[cnt++].right = xx + delta;
}
}
if (d<0 || MAX>d)
{
printf("Case %d: -1\n",t++);
continue;
}
sort(dis, dis + cnt, cmp);
memset(vis, 0, sizeof(vis));
int ans = 0;
dd tmp = dis[0];
for (int i = 1;i <= cnt;i++)
{
if (tmp.right < dis[i].left)
{
ans++;
tmp = dis[i];
}
}
printf("Case %d: %d\n", t++, ans+1);
}
return 0;
}