【发布时间】:2021-02-08 12:22:12
【问题描述】:
抱歉,我知道这类问题在这里已经有了答案,但我不知道如何将它用于我的代码。 我为解决问题的竞赛编写了一个程序,它接受一个数组并尝试最大化 |Ax−Ay|+|Ay−Az|+|Az−Ax| 的值在所有成对不同的有效索引 (x,y,z) 的三元组上。该程序有以下限制:
- 1≤t≤5
- 3≤n≤10^5
- |Ai|≤10^9 对于每个有效 i
当我尝试运行它时出现以下错误 - “在抛出 'std::bad_alloc' what(): std::bad_alloc 的实例后调用终止”。从已回答的问题中,我只能弄清楚我的代码遇到了内存分配问题,但我找不到它在何时何地这样做?也许当它处理大值时?是什么导致了错误?
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef vector<ll> vll;
typedef vector<int> vi;
#define rep(i, a, b) for (ll i = a; i < b; i++)
#define repi(i, a, b) for (ll i = a; i <= b; i++)
#define repn(i, a, b) for (ll i = a; i >= b; i--)
#define fast() \
ios_base::sync_with_stdio(false); \
cin.tie(NULL); \
cout.tie(NULL)
#define all(x) (x).begin(), (x).end()
// solve() function
void solve()
{
ll n;
cin >> n;
vll v(n);
rep(i, 0, n)
cin >>
v[i];
sort(all(v));
ll x = v[0], y = v[1], z = v[n - 1];
ll ans = abs(x - y) + abs(y - z) + abs(z - x);
cout << ans << endl;
}
// driver function
int main()
{
fast();
ll t = 1;
cin >> t;
rep(i, 0, t)
{
solve();
}
return 0;
}
输入格式如下:
Input
The first line of the input contains a single integer T denoting the number of test cases. The description of T test cases follows.
The first line of each test case contains a single integer N.
The second line contains N space-separated integers A1, A2,…,AN.
以下是输入示例:
3
3
2 7 5
3
3 3 3
5
2 2 2 2 5
【问题讨论】:
-
可能你输入的
n非常大,但是vector 无法分配那么多内存,以保留你需要做的vll.reserve(n)。它可能会解决您的问题,因为当您输入n时,vector 分配的内存比需要的多,这取决于编译器的实现。 -
如果您希望我们尝试分析您的代码,请对您的代码进行去混淆处理。您还应该添加程序的输入和发生异常的确切点。我可以看到一个明显的问题是缺少输入错误检查:您应该仔细检查
t尤其是n是否具有合理的值。 -
你在做什么?写一个简单的循环有什么问题?为什么要使用定义!别。它很容易出错,就像您在代码中看到的那样。
-
@JHBonarius 这是比赛模板的一部分。我只在参加定时比赛时使用它,以节省编写代码的时间。我尝试尽可能多地投入比赛问题的思考过程。这不是我通常编写代码的方式。
-
@MohitSingh 即使您的解决方案也只使用最小、第二小和最大的数字。您可以从任意大量的输入中确定那些,而无需存储三个以上的数字。 (实际上你只需要两个。应用一些代数。)