如何优化C++代码内存占用以通过织围巾编程题测试?
解决C++编程题内存超限问题
题目内容
织围巾时,不同针法消耗的绳子长度不同:
- '.' 针法:消耗 K 毫米绳子
- '/' 针法:消耗 M 毫米绳子
- '|' 针法:消耗 P 毫米绳子
需要计算完成围巾所需长度为 H 毫米的线团卷数。
输入规则
- 第一行输入两个整数 T、R(T 为行数,R 为每行字符数)
- 第二行输入四个整数 K、M、P、H
- 接下来输入 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; }
优化说明
- 取消批量存储输入行:读取一行就立即处理该行字符,处理完后直接丢弃,内存占用仅为单个字符串的大小,彻底解决栈溢出问题
- 替换非标准变长数组:改用标准
string变量,符合C++语法规范,避免非标准特性带来的不确定性 - 使用long long存储总长度:防止当T、R数值过大时,累加的总长度超出
int范围导致溢出 - 数学计算替代循环:
(total + h - 1) / h等价于向上取整除法,比循环减法更高效,尤其适合大数场景
内容的提问来源于stack exchange,提问作者Nurgalinchik
相关产品推荐
相关产品推荐

