You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手求助: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得到画布数量。

步骤分解

  1. 统计每种长度的木棍数量:用一个数组记录每个长度出现的次数(数组索引对应木棍长度,值对应数量),新手用数组比容器更易理解。
  2. 计算总配对数:对每个长度的数量做整数除法除以2,得到该长度能凑的对数,把所有对数相加。
  3. 计算画布数量:总配对数做整数除法除以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:45:43