c++ - 我正在尝试解决一个我需要数组总和值但代码不起作用的问题我想做这样的事情
问题描述
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;
}
}
该代码无法正常工作并且遇到错误有人可以帮助..吗?这个问题似乎很简单,但我无法为此提出有效的解决方案。
解决方案
给定 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; })
推荐阅读
- sql - 根据一列删除选择查询中的重复项
- json - 使用一些关键字从 JQ 构建 json 路径
- javascript - 使用 JavaScript/AJAX 将 PDF 从客户端保存到服务器
- c++ - C/C++ 编译器会通过重用最近计算的函数结果来优化代码吗?
- python-3.x - Matplotlib 如何为四个二维直方图绘制 1 个颜色条
- php - 函数 password_verify() 在应该返回 true 时返回 false
- c++ - Microsoft Access ODBC 驱动程序管理器函数序列错误
- d3.js - 如何在 D3.js 中的地图上绘制纬度/经度对
- html - 只有屏幕和(最小宽度:0px)和(最大宽度:327px)不起作用
- node.js - 如何在没有 root 访问权限的情况下部署 NodeJS 应用程序,以便在服务器重新启动后保持在线?