math — недопустимый системный вызов в программе тестирования c ++ (сумма программы диагональных матричных элементов)

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

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

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

выход:
Вы должны написать два числа:

* номер диагональной матрицы 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

2

Решение

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

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

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

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

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector