新手求助:C++实现数组木棍配对计数及画布数量计算
问题说明
我花了两天时间解决这个问题还是没做对。需求如下:
- 输入木棍数量(比如5)
- 再输入各木棍的长度(空格分隔整数,示例数组为
[4,4,3,3,4]) - 统计相同长度木棍的配对数:每2根同长度算1对,示例里一共2对
- 每2对可制作1个画框画布,最终输出能制作的画布数量
我是C++新手,搞不懂复杂逻辑,想要简单易懂的解法。之前用双重循环统计配对数有问题:当同长度木棍数量≥3时(比如[4,4,3,4,2]或[5,5,5,5,6]),统计的count值不对——比如第一个数组count会得到6,但实际该长度只有3根,应该是1对。
我的未完成代码:
#include<iostream> #include<cmath> #define MAX 100 int lookForPairs(int numberOfSticks); int main(void){ int numberOfSticks = 0, maxNumOfFrames = 0; std::cin >> numberOfSticks; maxNumOfFrames = lookForPairs(numberOfSticks); std::cout << maxNumOfFrames << std::endl; return 0; } int lookForPairs(int numberOfSticks){ int lengths[MAX], pairs = 0, count = 0, canvas = 0; for(int i=0; i<numberOfSticks; i++){ std::cin >> lengths[i]; } pairs = floor(count/2); canvas = floor(pairs/2); return count; }
之前尝试的有缺陷的循环代码片段:
for(int i=0; i<numberOfSticks; i++){ for (int j=0; j<numberOfSticks; j++){ if (lengths[i] == lengths[j] && i!=j) count++; } }
简单易懂的解决方案
核心思路:先统计每种长度木棍的数量,再计算每种长度能凑出多少对,最后用总配对数除以2得到画布数量。
步骤分解
- 统计每种长度的木棍数量:用一个数组记录每个长度出现的次数(数组索引对应木棍长度,值对应数量),新手用数组比容器更易理解。
- 计算总配对数:对每个长度的数量做整数除法除以2,得到该长度能凑的对数,把所有对数相加。
- 计算画布数量:总配对数做整数除法除以2,就是最终能做的画布数。
完整代码
#include<iostream> #define MAX_LENGTH 100 // 假设木棍长度不会超过100,可按需调整 int main() { int numberOfSticks; std::cin >> numberOfSticks; // 初始化计数数组,所有元素默认0 int count[MAX_LENGTH] = {0}; // 读取木棍长度并统计数量 for (int i = 0; i < numberOfSticks; i++) { int length; std::cin >> length; count[length]++; } int totalPairs = 0; // 计算每种长度能凑的配对数 for (int i = 0; i < MAX_LENGTH; i++) { totalPairs += count[i] / 2; } // 每2对制作一个画布 int canvasNum = totalPairs / 2; std::cout << canvasNum << std::endl; return 0; }
代码解释
- 计数数组
count:比如count[4] = 3表示长度为4的木棍有3根,直接通过索引快速统计,避免重复计算。 - 整数除法特性:C++中整数除以整数会自动取整,比如3/2=1、4/2=2,刚好符合"每2根凑1对"的需求。
- 效率更高:不需要嵌套循环,时间复杂度是O(n),比双重循环的O(n²)快很多。
测试示例
输入:
5 4 4 3 3 4
- 统计得
count[4]=3、count[3]=2 - 配对数:3/2=1 + 2/2=1 → 总配对数2
- 画布数:2/2=1 → 输出1(符合示例需求)
另一个测试用例:
输入:
5 4 4 3 4 2
- 统计得
count[4]=3、其他长度数量≤1 - 配对数:3/2=1 → 总配对数1
- 画布数:1/2=0 → 输出0
输入:
5 5 5 5 5 6
- 统计得
count[5]=4、count[6]=1 - 配对数:4/2=2 → 总配对数2
- 画布数:2/2=1 → 输出1
为什么之前的双重循环出错
双重循环中,每一对木棍会被统计两次(比如i=0,j=1和i=1,j=0都会触发count++);当有3根同长度木棍时,每个元素会和另外两个匹配,3×2=6次,导致count=6,但实际只能凑1对。这种方法重复统计且效率低,不如直接计数简单。
内容的提问来源于stack exchange,提问作者Job Enriquez
相关产品推荐
相关产品推荐

