我正在尝试解决一个需要数组和值但我的代码无法正常工作的问题,我想这样做

时间:2018-10-04 10:45:30

标签: c++ algorithm

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

说明:

  • 对数组进行排序,然后加2 + 3 = 5现在我们有5 4 6
  • 接下来我们加5 + 4 = 9现在我们有9和6
  • 接下来,我们添加9 + 6 = 15,最后返回29作为解,其总和为5 + 9 + 15 = 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;
    }
}

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

1 个答案:

答案 0 :(得分:1)

鉴于排序后的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,它将被添加到foosize(box) - i次(除了第一个元素将被添加{{ 1}}次。)因此,您可以非常简单地编写如下逻辑:

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中-校验。无论如何,如果您信任iftake your mutable lambda correctly,则可以像这样直接返回该总和:

accumulate

Live Example