问题:http://www.codechef.com/FEB14/problems/TWODOGS
我写了以下程序,但在内联判断codechef我得到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;
}
答案 0 :(得分:4)
给出样本输入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]
,这是不受约束的,并且结果修改了您不拥有的内存,即未定义的行为。这是你的程序失败的地方。
答案 1 :(得分:0)
如果您的标识符更有意义,那么您将会更轻松。那说:
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来分配。
答案 2 :(得分:0)
如果你仔细阅读了这个问题,
the element in a[i] <= 10 ^ 6 .
您声明了一个大小为n + 1的数组arr。
Constraint on n : n <= 500000
此外,您正在尝试访问可能超出数组arr限制的arr [a [i]]。
a[i] may be greater than 5 * 10^5 .
这导致分段错误错误。