1
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
#include <algorithm>
|
||||
|
||||
|
||||
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<pair<int, int>> 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<pair<int, int>> 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<pair<int, int>> 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user