Задача: Дана действительная квадратная матрица порядка [latex]n[/latex]. Получить [latex]{ x }_{ 1 }{ x }_{ n }+{ x }_{ 2 }{ x }_{ n-1 }+ \dots +{x }_{ n }{ x }_{ 1 }[/latex] , где [latex]{x }_{ k }[/latex] — наибольшее значение элементов [latex]k[/latex]-й строки данной матрицы.
n | Числа | Результат | n | Числа | Результат |
4 | 1 1 1 15 5 5 56 6 6 6
2 2 2 3 |
66 | 3 | 1.25 99 45 4.2 5.20.3 0 0.2 | 86.44 |
5 | 1 2 3 4 19 8 4 3 10 50 9 2 1
1 2 1 1 1 3 1 2 0 5 |
2576 | 5 | 0 0 0 0 05 9 10008 72 1777799 98 100 10 100
0 0 0 0 0 9.842 8 7 66 54 |
1000 |
Код программы на С++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include <iostream> using namespace std; int main() { int n; // размер матрицы cin >> n; double x[n][n]; //объявление матрицы как двухмерного массива for (int i=0; i<n; i++) // ввод данных for(int j=0; j<n; j++) cin >> x[i][j]; /*for(auto &row : x){ //распечатка массива (если понадобится) for(auto e:row) printf("%.2lf ", e); cout << "\n"; } cout << endl;*/ double y[n]; //массив в который будут определятся максимумы строк for (int i=0; i<n; i++){ //находим максимум каждой строки и кладем его в y[i]=x[i][0]; // соответствующую ячейку массива y for(int j=1; j<n; j++) y[i]= (y[i]>x[i][j])? y[i]:x[i][j]; } int str=0, end=n-1; //переменные для контроля симметричности относительно средней строки double result=0; // переменная для определения результата for (int i=0; i<n; i++){ // перемножаем нужные элементы и суммируем result+=y[str+i]*y[end-i]; //cout << result << "\t"; //печать суммы каждого шага } cout << result << endl; // вывод результата на экран return 0; } |
Код программы на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import java.util.*; import java.lang.*; import java.io.*; class Main { public static void main (String[] args) throws java.lang.Exception { Scanner in=new Scanner(System.in); int n; // размер матрицы n=in.nextInt(); double x[][]=new double[n][]; //объявление матрицы как двухмерного массива for (int i=0; i<n; i++){ x[i]=new double[n]; } for (int i=0; i<n; i++){ // ввод данных for(int j=0; j<n; j++) x[i][j]=in.nextDouble(); } double y[]=new double[n]; //массив в который будут определятся максимумы строк for (int i=0; i<n; i++){ //находим максимум каждой строки и кладем его в y[i]=x[i][0]; // соответствующую ячейку массива y for(int j=1; j<n; j++) y[i]= (y[i]>x[i][j])? y[i]:x[i][j]; } int str=0, end=n-1; //переменные для контроля симметричности относительно средней строки double result=0; // переменная для определения результата for (int i=0; i<n; i++){ // перемножаем нужные элементы и суммируем result+=y[str+i]*y[end-i]; //cout << result << "\t"; //печать суммы каждого шага } System.out.println(result); // вывод результата } } |
Суть задачи: находим максимум каждой строки определяем их в отдельный массив. Затем перемножаем симметричные относительно середины массива элементы и суммируем их.
P.S. Простите, таблицу я так и не смог нормально отрегулировать….
«В этой задаче, если матрица имеет нечетный порядок, я не проделываю никаких операций с максимум средней строки, а просто добавляю его к общей сумме. » — почему же? Смотрим: { x }_{ 1 }{ x }_{ n }+{ x }_{ 2 }{ x }_{ n-1 }+ \dots +{x }_{ n }{ x }_{ 1 } — это некоторое интуитивное задание математической формулы. Что мы видим: в каждом из трех приведенных слагаемых два сомножителя — делаем вывод, что во всех слагаемых два сомножителя (логично), первый сомножитель — это элементы массива с индексами 1, 2, …, n — делаем вывод: n слагаемых, индексы первого сомножителя образуют возрастающую последовательность всех натуральных чисел от 1 до n, аналогично смотря на индексы второго сомножителя делаем вывод, что индексы второго сомножителя образуют убывающую последовательность всех натуральных чисел от n до 1. Т.е. «Если требуется перемножать этот элемент как и остальные» — да требуется. Соответственно модифицируйте программу (Вы проделали лишнюю работу). Не забудьте пересчитать тесты и перепроверить результаты работы программы.
Оцениваю на 9.
10 поставил бы, например, за такое:
Достоинства — нет лишнего массива, короче текст, быстрее работает.