Я только начал изучать программирование, поэтому я прошу вашего понимания;) программа проверки принимает только несколько тестов, а остальные выдает ошибку незаконного системного вызова, и я понятия не имею, как «откусить ее».
задача: (ВНИМАНИЕ, программа должна экономить память) написать программу, которая найдет в квадратной матрице диагональ с наибольшей суммой диагоналей элементов (только справа). как на картинке
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 МБ)
альтернативное решение: (потребление памяти ~ 10 кБ)
Других решений пока нет …