酷代码 AI
菜单

本庭院里有一排树,一共有n(n<100)棵。机器人们一共把m个区域的树木都摧毁了。每个区域都包含了连续的几棵树木,其中第i个区域包含的树木为从Li开始到Ri为止之间的所有的树木。当然了,这些区域有可能会重合,但是每棵树只会被摧毁一次。请你计算一下最终还剩下几棵完好无损的树木? 输入: 第一行两个数n和m代表树的总数和区域数。 接下来m行,每行两个数Li和Ri,表示每个区域的范围c++

以下是解决该问题的C++代码: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n, m; // 输入树的总数n和区域数m cin >> n >> m; // 用于标记每棵树是否被摧毁,初始都为未摧毁 vector<bool> destroyed(n + 1, false); for (int i = 0; i < m; ++i) { int Li, Ri; // 输入每个区域的起始和结束位置 cin >> Li >> Ri; // 将该区域内的树标记为已摧毁 for (int j = Li; j <= Ri; ++j) { destroyed[j] = true; } } int intactCount = 0; // 统计未被摧毁的树的数量 for (int i = 1; i <= n; ++i) { if (!destroyed[i]) { intactCount++; } } // 输出未被摧毁的树的数量 cout << intactCount << endl; return 0; } ``` 代码解释: 1. 输入处理:首先读取树的总数`n`和区域数`m`。然后使用一个长度为`n + 1`的布尔型向量`destroyed`来标记每棵树是否被摧毁,初始时所有元素都为`false`,表示未被摧毁。 2. 标记被摧毁的树:对于每个区域,读取其起始位置`Li`和结束位置`Ri`,并将该区域内的所有树在`destroyed`向量中对应的元素标记为`true`。 3. 统计未被摧毁的树:遍历`destroyed`向量,统计值为`false`的元素个数,即未被摧毁的树的数量。 4. 输出结果:输出未被摧毁的树的数量。 复杂度分析: - 时间复杂度:$O(n * m)$,其中`n`是树的总数,`m`是区域数。因为对于每个区域,都需要遍历该区域内的所有树。 - 空间复杂度:$O(n)$,主要用于存储`destroyed`向量。 [2026-01-24 19:20:52 | AI问答 | 522点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多