C++实现从n根火柴中选取3根构成正三角形的方法计数
### 问题分析 要从`n`根火柴中选取 3 根构成正三角形,那么这 3 根火柴的长度必须相等。我们可以先读取所有火柴的长度,然后统计每种长度火柴的数量,对于每种长度的火柴,若其数量大于等于 3 根,则可以从中选取 3 根构成正三角形,根据组合数公式\(C_{m}^3=\frac{m!}{3!(m - 3)!}=\frac{m\times(m - 1)\times(m - 2)}{6}\)(其中\(m\)为该长度火柴的数量)来计算选取的方法数,最后将所有满足条件的长度的选取方法数相加即可。 ### 代码实现 ```cpp #include <iostream> #include <vector> #include <unordered_map> using namespace std; // 计算从 m 个元素中选取 3 个元素的组合数 int combination(int m) { return m * (m - 1) * (m - 2) / 6; } int main() { int n; cin >> n; // 用于统计每种长度火柴的数量 unordered_map<int, int> lengthCount; // 读取每根火柴的长度并统计数量 for (int i = 0; i < n; ++i) { int length; cin >> length; lengthCount[length]++; } int totalWays = 0; // 遍历每种长度的火柴 for (const auto& pair : lengthCount) { int count = pair.second; // 如果该长度的火柴数量大于等于 3 根,则计算组合数并累加到总方法数中 if (count >= 3) { totalWays += combination(count); } } cout << totalWays << endl; return 0; } ``` ### 代码解释 1. **`combination`函数**:该函数用于计算从`m`个元素中选取 3 个元素的组合数,根据组合数公式\(\frac{m\times(m - 1)\times(m - 2)}{6}\)进行计算。 2. **`main`函数**: - 首先读取火柴的数量`n`。 - 然后使用`unordered_map<int, int>`来统计每种长度火柴的数量,遍历输入的每根火柴长度,将其数量加 1。 - 接着遍历`unordered_map`,对于每种长度的火柴,若其数量大于等于 3 根,则调用`combination`函数计算组合数并累加到`totalWays`中。 - 最后输出总方法数。 ### 复杂度分析 - **时间复杂度**:\(O(n)\),其中\(n\)为火柴的数量。主要时间开销在于读取火柴长度和统计数量。 - **空间复杂度**:\(O(k)\),其中\(k\)为不同长度火柴的种类数。主要空间开销在于存储每种长度火柴的数量。 ### 开发建议 - **输入验证**:在实际应用中,应添加对输入的验证,例如确保火柴数量`n`为正整数,火柴长度为非负整数等。 - **错误处理**:可以添加对输入异常情况的处理,例如输入格式错误、内存分配失败等。 - **性能优化**:如果火柴长度的范围较小,可以使用数组代替`unordered_map`来统计数量,以提高性能。 ### 相关学习资源 - C++ 官方文档:https://en.cppreference.com/w/ - 《C++ Primer》:经典的 C++ 学习书籍,涵盖了 C++ 的基础知识和高级特性。 ######[AI写代码神器 | 865点数解答 | 2026-03-01 17:19:18]
- 深入解析格雷码生成算法:递归求解与代码实现(DeepSeek | 443点数解答 | 2026-01-05 12:21:49)42
- Java 实现计算机硬件模拟:从 PCI 设备到主板、计算机的启动与关闭(字节豆包 | 716点数解答 | 2024-12-08 23:38:38)313
- Java 代码:模拟计算机主板启动与关闭 PCI 设备全流程(字节豆包 | 637点数解答 | 2024-12-09 08:31:54)285
- Java 实战:Vehicle 类与 User 类实现机动车速度功率控制( | 968点数解答 | 2024-03-12 11:26:25)535
- Java 实战:动物类、接口与继承实现鸟儿吃虫和飞翔功能(字节豆包 | 183点数解答 | 2024-09-19 15:53:55)278
- Java 实战:动物类、接口与继承,实现鸟儿吃虫与飞翔功能(字节豆包 | 184点数解答 | 2024-09-19 16:45:48)301
- Java 实现 BankAccount 类:账户余额管理与测试全解析(字节豆包 | 420点数解答 | 2024-10-11 08:48:21)310
- Java 编程:实现教师与学生类的创建、继承及属性操作(字节豆包 | 745点数解答 | 2024-10-16 18:40:42)384
- Java 实现 Circle 类:全面封装圆的属性与方法(字节豆包 | 256点数解答 | 2024-10-27 16:34:37)237
- Java 实现继承关系:Fu 类、Zi 类与测试类 Example04 代码解析及注意要点(字节豆包 | 251点数解答 | 2024-12-12 09:36:45)240
- Java实现银行账户类:含账户余额操作与测试代码(DeepSeek | 711点数解答 | 2025-03-23 21:38:57)250
- Java 实现银行账户类:含异常处理与日志输出的账户操作详解(字节豆包 | 484点数解答 | 2025-05-05 17:07:36)305