2015-10-02 136 views
-1
#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <string> 
#include <stack> 
#include <queue> 
#include <utility> 
#include <functional> 
#include <cmath> 
#include <climits> 
using namespace std; 

#define pb push_back 
#define mp make_pair 
#define ll long long 


int main (void) 
{ 
    int i,j,k,n; 
    int arr[500001]; 
    long long ans[500001]; 
    int val = INT_MIN; 
    cin>>n; 
    for (i = 0; i < n; i++) 
    { 
     cin>>arr[i]; 
     if (val < arr[i]) 
      val = arr[i]; 
    } 
    long long count[500001]; 
    for (i = 0; i < n; i++) 
     count[arr[i]]++; 
    //int ans = INT_MIN; 
    ans[0] = 0; 
    ans[1] = count[1]; 
    for (i = 2; i <= val; i++) 
    { 
     ans[i] = max(ans[i-1],ans[i-2]+count[i]*i); 
    } 
    cout<<ans[val]<<"\n"; 
    return 0; 
} 

所以,我实现了这个简单的代码,我在那里声明3个数组,并根据我的问题(这是一个单独的事情)尝试稍微调整一下。但是一旦我启动这个代码,我就会看到一个分段错误。我不知道为什么?为什么会发生?我试图通过调试器运行它,它显示了max函数中可能的错误。因此,我创建了自己的maxi函数,但它仍然显示分段错误?为什么在此代码中出现分段错误?

编辑:关于使用调试器,它显示以下内容:

template <class _Tp, class _Compare> 
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 
const _Tp& 
max(const _Tp& __a, const _Tp& __b, _Compare __comp) 
{ 
    return __comp(__a, __b) ? __b : __a; 
} 

Thread 1: EXC BAD_ACCESS (code=2, address=0x7fff5f276154)

+2

也许使用调试器将至少告诉发生这种情况的线路 –

+2

PS。相当大的结构放在堆栈上。把它们放在堆上。这可能会帮助 –

+0

'arr [i]'或'val'可以超过'500000'吗? – NathanOliver

回答

0

应该有栈溢出。

考虑使用new[]来分配足够的内存而不是过多的内存。

对于临时修复,请在intlong long之前将static添加到三个非常大的阵列。

相关问题