对于问题:http://www.codechef.com/FEB14/problems/TWODOGS
我写了以下程序,但在内联判断代码厨师上,我收到 SIGSEGV 错误。我想具体知道哪个指令在我的程序中创建了此错误,以便我尝试删除它。这是代码:
#include<iostream>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
int arr[n+1];
for(int i=1;i<n+1;i++)
arr[i]=n+1;
for(int i=0;i<n;i++)
{
int p=min(i+1,n-i);
arr[a[i]]=min(arr[a[i]],p);
}
int time=n+1;
for(int i=0;i<n;i++)
{
int p=a[i];
if(p!=k-p&&p<k)
time=min(time,max(arr[p],arr[k-p]));
}
if(time==n+1)
cout<<"-1";
else
cout<<time;
}
给定示例输入 2:
Sample Input 2:
5 5
2 4 9 2 5
你不能这样做
arr[a[i]]=min(arr[a[i]],p);
因为当i == 2
时,arr[a[i]]
将被评估为arr[9]
,这是越界的,结果是修改你不拥有的内存,即未定义的行为。这是您的程序失败的地方。
如果您的标识符更有意义,您将度过更轻松的时间。 可是:
cin>>a[i];
....
arr[a[i]]=min(arr[a[i]],p);
您正在通过用户输入为 arr[] 编制索引。 如果您遇到段错误,最好为这些情况输入断言,以防假设无效,例如:
assert(a[i] < n-1);
下一个:
time=min(time,max(arr[p],arr[k-p]));
同样,根据用户输入对数组进行索引。 添加另一个断言来测试 arr[p] 和 arr[k-p] 是否有效。
最后,对于这一行:
if(p!=k-p&&p<k)
你的意思是:
if(p!=k-p&&p<n)
a 是根据 n 而不是 k 分配的。
如果你仔细阅读这个问题,
the element in a[i] <= 10 ^ 6 .
您已声明大小为 n+1 的数组 arr。
Constraint on n : n <= 500000
此外,您正在尝试访问 arr[ a[i] ],这可能超出了数组 arr 的限制。
a[i] may be greater than 5 * 10^5 .
这会导致分段错误。