今天我正在Codechef https://www.codechef.com/problems/CHPINTU上解决问题,在这里我得到了运行时错误sigsegv,下面的代码是请帮助我。以下是C ++代码
while(t!=0){
int n,m;
cin>>n>>m;
int f[n],p[n];
for(int i=0;i<n;i++)
cin>>f[i];
for(int i=0;i<n;i++)
cin>>p[i];
int freq[m+1];
bool avail[m+1];
memset(avail,false,sizeof(avail));
memset(freq,-1,sizeof(freq));
for(int i=0;i<n;i++){
freq[f[i]]+=p[i];
avail[f[i]]=true;
}
int min = INT_MAX;
for(int i=0;i<=m;i++){
if(freq[i]<min && avail[i]==true){
min=freq[i];
}
}
cout<<min<<"\n";
t--;
}
答案 0 :(得分:0)
cin>>n>>m;
int f[n],p[n];
数组的长度不能为变量。
您可以使用vector
或new
。
vector<int> f(n);
//or
int *f = new int[n];
//remember to delete after new
在您的代码中发现其他错误:
memset(freq,-1,sizeof(freq));
freq[f[i]]+=p[i];
freq [i]是类型i的总价。因此,应该将freq [i]初始化为0而不是-1。
您可以使用freq[i]==0
来确定是否有这样的篮子。这样可以节省avail
占用的内存。
答案 1 :(得分:0)
我可以在您的代码中找到两个问题。 首先,对于所有'i'值,f [i]不能为0。因此,freq [0]将具有一些垃圾值,您将其与'min'进行比较。您可以尝试减去1,然后将其用作freq数组中的索引。
freq[f[i]-1]+=p[i];` avail[f[i]-1] = true;`
还可以将频率的大小更改为“ m”而不是“ m + 1”。 其次,将freq数组初始化为0而不是-1,因为您正在为其索引添加值,因此-1作为初始值将更改最终结果。
memset(freq,0,sizeof(freq));
进行这些更改后,我提交了一份意见书,并被接受。您也可以尝试。