недопустимый системный вызов в программе тестирования c ++ (сумма программы диагональных матричных элементов) - PullRequest
0 голосов
/ 11 мая 2018

Я только начал изучать программирование, поэтому я прошу вашего понимания;) программа проверки принимает только несколько тестов для остальных, выдает ошибку незаконного системного вызова, и у меня нет идей, как «откусить это».

задача: (ВНИМАНИЕ, программа должна экономить память) написать программу, которая найдет в квадратной матрице диагональ с наибольшей суммой диагоналей элементов (только справа).как на картинке https://i.stack.imgur.com/Cex9o.jpg

МАКС. ВРЕМЯ: 1 с, МАКС. память использует 3 МБ;вход: в первой строке есть натуральное число n (не более 1000), обозначающее размер матрицы A. В каждой из следующих n строк есть последовательность из n целых чисел (из диапазона -10000..10000)- это элементы следующей строки матрицы A.

output: необходимо записать два числа:

* номер диагональной матрицы A с наибольшей суммой элементов (еслиЕсть несколько таких чисел, наименьшее из них должно быть напечатано), * значение этой суммы.

примерно так: https://i.stack.imgur.com/bM7AP.jpg

Я подозреваю, что программа превышает 3 МБ памяти, поэтому он не проходит несколько тестов и выдает ошибку недопустимого системного вызова.Я понятия не имею, как лучше решить эту задачу, поэтому, пожалуйста, помогите мне;)

#include <iostream>

using namespace std;

int main(){
    short length;
    short counter=0;
    short which=0;
    int largest_sum=-10000000;
    int sum=0;

    cin>>length;
    //matrix declaration
    short **matrix = new short*[length];

    for(short row=0; row<length; row++){
        matrix[row] = new short [length];
    }
    //filling the matrix
    for(short row=0; row<length; row++){
        for(int column=0; column<length; column++){
            cin>>matrix[row][column];
        }
    }
    //calculating the sum of diagonals and choosing the largest one (half of all diagonals)
    for(short row=length-1; row>=0; row--){
        short r=row;
        short c=0;
        while(r<length){
            sum+=matrix[r][c];
            r=r+1;
            c=c+1;
        }
        ++counter;

        if(sum>largest_sum){
            largest_sum=sum;
            which=counter;
        }
        sum=0;
    }
    //calculating the sum of diagonals and choosing the largest one (second half of all diagonals)
    for(short row=1; row<length; row++){
        short r=0;
        short c=row;
        while(c<length){
            sum+=matrix[r][c];
            r=r+1;
            c=c+1;
        }
        ++counter;
        if(sum>largest_sum){
            largest_sum=sum;
            which=counter;
        }
        sum=0;
    }
    //removing from memory
    for(short i=0; i<length; i++){
        delete [] matrix[i];
    }
    delete [] matrix;
    //score
    cout<<which<<" "<<largest_sum;

    return 0;
}

мой код: https://ideone.com/6Qd1yF

1 Ответ

0 голосов
/ 11 мая 2018

некоторые советы по улучшению текущего решения: (потребление памяти ~ 2 МБ)

  • используйте std :: vector или std :: array (вам не нужно new и затем удаляйте)
  • создать отдельную функцию, в которой вы даете координаты первого элемента и получаете диагональную сумму

альтернативное решение: (потребление памяти ~ 10 кБ)

  • если вы присмотритесь, вы увидите, что каждая запись вносит вклад только в одну из диагоналей
  • вспомним функцию, которая дает вам номер диагонали для каждой пары координат
  • во время чтения матрицы просто добавьте значение к сумме соответствующей диагонали (вам не нужно хранить фактическую матрицу)
  • в конце просто выберите самую большую сумму
...