首页 > 解决方案 > 我正在尝试解决一个我需要数组总和值但代码不起作用的问题我想做这样的事情

问题描述

Input:4
Input: 4 2 3 6
Output :29

解释:

我必须为此编写代码。

这是我的代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int num;
    cin >> num;
    vector<int> box;
    for (int i = 0; i < num; i++)
    {
        int temp;
        cin >> temp;
        box.push_back(temp);
    }
    sort(box.begin(), box.end());
    vector<int> res;
    int sum = box[0];
    if (box.size() == 1)
    {
        cout << sum;
    }
    else
    {
        for (int i = 1; i < box.size(); i++)
        {
            sum = sum + box[i];
            res[i] = sum;
        }
        res[0] = 0;
        int result = 0;
        for (int i = 0; i < res.size(); i++)
        {
            result += res[i];
        }
        cout << result;
    }
}

该代码无法正常工作并且遇到错误有人可以帮助..吗?这个问题似乎很简单,但我无法为此提出有效的解决方案。

标签: c++algorithm

解决方案


给定 sorted vector<int> box,您要查找的值可以这样分配foo

foo += box[0] + box[1];
foo += box[0] + box[1] + box[2];
foo += box[0] + box[1] + box[2] + box[3];

很明显,对于给定的从零开始的元素索引i,它将被添加到foo,size(box) - i次(第一个元素除外,它将被添加size(box) - 1次。)所以你可以非常简单地编写如下逻辑:

auto foo = box.front() * (size(box) - 1);

for(auto i = 1; i < size(box); ++i) {
    foo += box[i] * (size(box) - i);
}

这显然期望其中至少有 2 个元素box(如果box为空,则甚至未定义。)所以显然这需要包含在if-check 中。无论如何,如果你相信正确accumulate使用你的可变 lambda,你可以直接返回这个总和,如下所示:

accumulate(next(cbegin(box)), cend(box), box.front() * (size(box) - 1), [i = size(box)](const auto lhs, const auto rhs) mutable { return lhs + rhs * --i; })

Live Example


推荐阅读