Почему я получаю ошибку времени выполнения SIGSEGV в этом коде - PullRequest
1 голос
/ 19 марта 2020

Сегодня я решал проблему с 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--;
    }

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Есть две проблемы, которые я могу найти в вашем коде. Во-первых, для всех значений 'i' f [i] не может быть 0. Итак, freq [0] будет иметь некоторое значение мусора, и вы сравниваете его с 'min'. Вы можете попытаться вычесть 1, а затем использовать его в качестве индекса в массиве freq.

freq[f[i]-1]+=p[i];` avail[f[i]-1] = true;`

Также измените размер freq и используйте 'm', а не 'm + 1'. Во-вторых, инициализируйте массив freq с 0, а не с -1, так как вы добавляете значения к его индексу, так что -1 в качестве начального значения изменит конечные результаты.

memset(freq,0,sizeof(freq));

Я сделал представление после внесения этих изменений и это было принято. Вы тоже можете попробовать.

0 голосов
/ 19 марта 2020
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.

...