我正在尝试解决我在网上发现的一个问题,但我一直得到内存错误。
你需要织一条围巾,为一个。循环你需要Kmm的绳子,对于/和|M和P毫米。目标是找出长度为H的线的个数。你需要完成围巾。
在第一行输入2个变量:T,R.
在第二行输入:K,M,P和H.
然后输入TR字符。
一个例子:输入:
3 20 4 7 4 128 |...|//./|..|||..|./ ../....||/...||.|/|| |||///||/.|||///|//.
输出:
3
这个文件正在测试这个问题。
我怎样才能使代码使用更少的内存?
我试着用我写的代码:
#include <iostream>
using namespace std;
int main() {
int t, r, k, m, p, h, a, ans, i, j;
ans = 0;
a = 0;
cin >> t >> r;
string knit[t];
cin >> k >> m >> p >> h;
for (i = 0; i < t; i++) {
cin >> knit[i];
}
for (i = 0; i < t; i++) {
for (j = 0; j < r; j++) {
if (knit[i][j] == '.') {
a += k;
}
else if (knit[i][j] == '/') {
a += m;
}
else {
a += p;
}
}
}
while (a > 0) {
a -= h;
ans++;
}
cout << ans;
}
它工作得很好,但是我一直得到内存限制错误。
我对你的例程做了以下改进:
- 现在需要创建一个数组,我们只需要为一行分配足够的内存。
- 我超额分配了所需的内存,即允许一行中有1024个字符,但我们将只处理输入长度
- 我使用查找表将缝线图案映射到数字
- 最后,我使用整数数学来计算所需的结果-它通过在除以h 之前预先添加(h - 1)来实现舍入
#include <iostream>
using namespace std;
int main() {
int t, r;
cin >> t >> r;
int k, m, p, h;
cin >> k >> m >> p >> h;
int table[256] = { };
table['.'] = k;
table['/'] = m;
table['|'] = p;
int x = 0;
for (int i =0; i < t; i++) {
char line[1024] = { };
cin >> line;
for (int j = 0; j < r; j++) {
x += table[line[j]];
}
}
cout << ((x + h - 1) / h) << 'n';
return 0;
}