/*
 *POJ 1328 看了解题报告。觉得思路很简单。就是把每个island的区间求出来。方法是也就是以该island为圆心,画半圆。和x-axis的两交点就是区间端点。
 *然后。temp为第一个点的右端点。ans = 1。开始遍历。如果遇见一个点的左端点大于temp。就ans++。temp重新设为这个点的右端点。即又安了一个雷达。
 *最后输出ans就好了。
 *因为没有考虑d<0的情况。所以WA了几次。果然出数据的人都是不可靠的。
 *还有就是 输入循环里的break 和 外层循环里的 continue ...各种debug...
 */

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
#define tot 1000+10

struct Interval  // 保存每个点的可设雷达区间。
{
    double left, right;
} interval[tot];

struct Point
{
    int x, y;
} point[tot];

int n, d, ans;
int i, j, k;
int cnt = 0;

double cmp(Interval a, Interval b)   //对区间排序
{
    if (a.right != b.right)
        return a.right < b.right;
    else return a.left < b.left;
}

int main()
{
    ans = 0;
    bool flag = true;
    while(cin >> n >> d)
    {
        flag = true;
        ans = 0;
        if (n == 0 && d == 0)
            break;
        if (d < 0) flag = false;   // 数据并没有说 d>=0 ...没有结果输出-1的情况。
        cout << "Case " << ++cnt << ": ";

        for (i=0; i<n; ++i)
        {
            cin >> point[i].x >> point[i].y;
            double ans = d*d - point[i].y*point[i].y;   //计算每个小岛的区间范围。
            if (ans < 0)
            {
                flag = false;
               // break;   // break会使输入中断。
            }
            else if (flag)
            {
               ans = sqrt(ans);
               interval[i].left = point[i].x - ans;
               interval[i].right = point[i].x + ans;
            }
        }

        if (!flag)
        {
            cout << -1 << endl;
            continue;    // 不是break.
        }

        sort(interval, interval+n, cmp);
        double temp = interval[0].right;
        ans += 1;

        for (int i=1; i<n; ++i)
        {
            if (interval[i].left > temp)  // 新安上一个雷达。
            {
               ans += 1;
               temp = interval[i].right;
            }
        }
        cout << ans << endl;
    }
    return 0;
}

posted on 2015-07-21 11:06  小小八  阅读(189)  评论(0编辑  收藏  举报