#include #include #include #include using namespace std; double other_leg(const double leg, const double diag) { return sqrt(diag * diag - leg * leg); } double diag(const double leg1, const double leg2) { return sqrt(leg1 * leg1 + leg2 * leg2); } int required_radars(vector> islands, int distance) { for (auto& [island_x, island_y] : islands) { if (island_y > distance) { return -1; } } sort(islands.begin(), islands.end()); int answer = 0; while (!islands.empty()) { answer++; const auto current_island = islands.back(); islands.pop_back(); double min_x = current_island.first - other_leg(current_island.second, distance) - current_island.second; vector> uncovered_islands; while (!islands.empty() && islands.back().first >= min_x) { // 右移雷达 const double offset = other_leg(islands.back().second, distance); if (islands.back().first - offset >= min_x) { min_x = islands.back().first - offset; } else { uncovered_islands.push_back(islands.back()); } islands.pop_back(); } for (int i = uncovered_islands.size() - 1; i >= 0; i--) { // NOLINT(*-narrowing-conversions) islands.push_back(uncovered_islands[i]); } } return answer; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, distance, case_id = 0; while (cin >> n >> distance) { if (n == 0 && distance == 0) { break; } vector> islands(n); for (int i = 0; i < n; i++) { cin >> islands[i].first >> islands[i].second; } cout << "Case " << ++case_id << ": " << required_radars(islands, distance) << endl; } }