1 条题解
-
0
题意分析
题目要求计算道路上剩余的树木数量。初始时,道路从米到米每隔米种一棵树,共 棵。随后给定多个不重叠的占用区间,每个区间内的树木(包括端点)会被移除,需计算剩余树木总数。
解题思路
- 初始树数计算:长度为 的道路,树木位置为 ,共 棵。
- 区间树木移除:每个占用区间 包含 棵树(端点包含在内)。由于区间不重叠,直接累加所有区间的树木数量并从总数中扣除即可。
- 高效计算:无需遍历每个位置,通过数学方法直接计算每个区间的长度,时间复杂度为 ,适用于 极大的情况(如 )。
代码解释
#include <cstdio> #include <cstdlib> #include <cstring> int main(void) { unsigned int trees; // 初始树木数(道路长度L) int M; // 占用区间数量 unsigned int start, end; // 区间起点和终点 while (scanf("%u%d", &trees, &M), trees != 0 || M != 0) { // 初始树木数为L+1(0到L共L+1个点) trees += 1; for (int i = 0; i < M; i++) { scanf("%u%u", &start, &end); // 区间[start, end]包含end - start + 1棵树,从总数中扣除 trees -= (end - start + 1); } printf("%u\n", trees); } return 0; }
注意事项
- 初始树数计算:
- 道路长度为 时,树木数量为 (包含米和米处的树),代码中通过
trees += 1
正确处理。
- 道路长度为 时,树木数量为 (包含米和米处的树),代码中通过
- 区间长度计算:
- 区间 的树木数量为 (两端点均包含),直接相减后加即可。
- 输入处理:
- 使用
unsigned int
存储长度和坐标,避免负数问题。 - 循环终止条件为 且 ,通过逗号表达式确保输入正确解析。
- 使用
- 数据范围:
- 题目中 可达 ,但 ,算法效率极高,无需担心性能问题。
复杂度分析
- 时间复杂度:,每个测试用例遍历 个区间,进行常数时间计算。
- 空间复杂度:,仅存储输入参数和临时变量。
- 1
信息
- ID
- 1665
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者