1 条题解
-
0
解题思路
- 主函数
main:- 使用
while循环读取输入的海岛数量island和雷达覆盖半径radius,当island和radius都为0时结束循环。 - 为每个海岛创建一个
Interval结构体来表示其在x轴上的投影区间。 - 读取每个海岛的坐标
x和y,如果y大于radius,则该海岛不在雷达覆盖范围内,标记isSolvable为false。 - 根据勾股定理计算海岛在
x轴上投影区间的左端点left和右端点right。 - 调用
solve函数计算覆盖所有海岛所需的最少雷达数量minRadar,如果isSolvable为false,则minRadar为-1。 - 输出每个测试用例的结果,格式为
"Case X: Y",其中X为测试用例编号,Y为最少雷达数量。 - 释放
intervals数组的内存。
- 使用
- 函数
solve:- 使用
sort函数对intervals数组按照区间左端点进行排序,排序规则由compare函数确定。 - 初始化最少雷达数量
minPoint为1,并将第一个区间的右端点赋值给right。 - 遍历
intervals数组:- 如果当前区间的左端点大于
right,则需要新增一个雷达,minPoint加1,并将当前区间的右端点赋值给right。 - 如果当前区间的右端点小于
right,则更新right为当前区间的右端点。
- 如果当前区间的左端点大于
- 返回最少雷达数量
minPoint。
- 使用
- 函数
compare:- 比较两个区间
a和b的左端点,返回a的左端点小于等于b的左端点的结果。
- 比较两个区间
#include <math.h> #include <algorithm> #include <iostream> using namespace std; // 海岛在x轴上的投影区间 struct Interval { double left; // 左端点在x轴上的坐标 double right; // 右端点在x轴上的坐标 }; int solve(Interval* intervals, int size); bool compare(Interval a, Interval b); int main(void) { int island, radius, testCase = 0; while ((cin >> island >> radius) && island && radius) { const double R2 = radius * radius; // 半径平方 Interval* intervals = new Interval[island]; bool isSolvable = true; for (int i = 0; i < island; i++) { double x, y; cin >> x >> y; if (y > radius) { // 存在海岛不在雷达的最大影响范围,无解 isSolvable = false; } double offset = sqrt(R2 - y * y); // 勾股定理 intervals[i].left = x - offset; intervals[i].right = x + offset; } int minRadar = (isSolvable ? solve(intervals, island) : -1); cout << "Case " << ++testCase << ": " << minRadar << endl; delete[] intervals; } return 0; } int solve(Interval* intervals, int size) { sort(intervals, intervals + size, compare); int minPoint = 1; double right = intervals[0].right; for (int i = 1; i < size; i++) { // 区间i-1 与 区间i 无交集 if (intervals[i].left > right) { minPoint++; right = intervals[i].right; // 区间i-1 在 区间i 内部 } else if (intervals[i].right < right) { right = intervals[i].right; } else { // Undo: 区间i-1 与 区间i 相交 } } return minPoint; } bool compare(Interval a, Interval b) { return a.left <= b.left; } - 主函数
- 1
信息
- ID
- 329
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者