首页 > 解决方案 > 如何减少内存使用?来自代码力量的问题

问题描述

我从 codeforces 解决了这个问题:https ://codeforces.com/problemset/problem/1471/B 。但是当我上传它时,它说超出了内存限制。如何减少内存使用量?我使用 C++ 来解决这个问题。问题如下:“你给了一个长度为 n 的数组 a 和一个整数 x 给一个全新的机器人。机器人所做的如下:它遍历数组的元素,让当前元素为 q。如果 q 可以被 x 整除,则机器人将整数 qx 的 x 个副本添加到数组的末尾,并移动到下一个元素。注意,新添加的元素可以稍后由机器人处理。否则,如果 q 是不能被 x 整除,机器人关闭。

请在过程结束时确定数组所有值的总和”。

这是代码:

#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

int main()
{

    vector<int> vec;
    vector<int> ans;
    int temp;

    int t;
    cin >> t;
    int a = 0;
    int n, x;

    for(int i=0; i<t; i++){
            cin >> n >> x;
        while(a<n){
            cin >> temp;
            a++;
            vec.push_back(temp);
        }

        int q = 0;

        while(true){
            if(vec[q]%x == 0){
                for(int copies=0; copies<x; copies++){
                    vec.push_back(vec[q]/x);
                }
            }
            else{
                break;
            }
            q++;
        }

        int sum = 0;
        for(int z: vec){
            sum += z;
        }
        ans.push_back(sum);

        vec.clear();
        a = 0;
    }

    for(int y: ans){
        cout << y << endl;
    }

    return 0;

}

谢谢。

标签: c++memory-management

解决方案


您不需要按照指定构建数组来计算总和

你可能会这样做:

int pow(int x, int n)
{
    int res = 1;

    for (int i = 0; i != n; ++i) {
        res *= x;
    }
    return res;
}

int compute(const std::vector<int>& vec, int x)
{
    int res = 0;
    int i = 0;
    while (true) {
        const auto r = pow(x, i);
        for (auto e : vec) {
            if (e % r != 0) {
                return res;
            }
            res += e;
        }
        ++i;
    }
}

演示


推荐阅读