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

如何优化C++代码内存占用以通过织围巾编程题测试?

解决C++编程题内存超限问题

题目内容

织围巾时,不同针法消耗的绳子长度不同:

  • '.' 针法:消耗 K 毫米绳子
  • '/' 针法:消耗 M 毫米绳子
  • '|' 针法:消耗 P 毫米绳子

需要计算完成围巾所需长度为 H 毫米的线团卷数。

输入规则

  1. 第一行输入两个整数 T、R(T 为行数,R 为每行字符数)
  2. 第二行输入四个整数 K、M、P、H
  3. 接下来输入 T 行,每行包含 R 个字符(仅包含'.'、'/'、'|')

示例输入

3 20
4 7 4 128
|...|//./|..|||..|./
../....||/...||.|/||
|||///||/.|||///|//.

示例输出

3

原代码问题分析

触发内存错误的核心原因:

  • 使用了非标准C++特性的变长数组string knit[t]:C++标准不支持栈上的变长数组,当 T 数值较大时,有限的栈空间会被直接撑爆(栈内存通常仅几MB)
  • 额外存储所有输入行,占用了不必要的内存空间,进一步加剧内存压力

优化后的代码

#include <iostream>
#include <string>

using namespace std;

int main() {
    int t, r, k, m, p, h;
    long long total = 0; // 用long long避免大数累加时的整数溢出
    cin >> t >> r;
    cin >> k >> m >> p >> h;
    
    string line;
    for (int i = 0; i < t; ++i) {
        cin >> line;
        // 读取一行后直接处理,不存储所有行
        for (char c : line) {
            if (c == '.') {
                total += k;
            } else if (c == '/') {
                total += m;
            } else {
                total += p;
            }
        }
    }
    
    // 用向上取整除法代替循环,高效计算所需线团数
    int ans = (total + h - 1) / h;
    cout << ans << endl;
    
    return 0;
}

优化说明

  1. 取消批量存储输入行:读取一行就立即处理该行字符,处理完后直接丢弃,内存占用仅为单个字符串的大小,彻底解决栈溢出问题
  2. 替换非标准变长数组:改用标准string变量,符合C++语法规范,避免非标准特性带来的不确定性
  3. 使用long long存储总长度:防止当T、R数值过大时,累加的总长度超出int范围导致溢出
  4. 数学计算替代循环:(total + h - 1) / h等价于向上取整除法,比循环减法更高效,尤其适合大数场景

内容的提问来源于stack exchange,提问作者Nurgalinchik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:10:26