Программное решение задач ЕГЭ по информатике

Задача 5925. Источник: Поляков. Задание КИМ 17

Страница задачи 5925

(Е. Джобс)

В файле 17-353.txt содержится последовательность натуральных чисел, не превышающих 10000. Симметричной парой называется такая пара чисел в заданной последовательности, элементы которой расположены на равном расстоянии от концов последовательности. Например, в последовательности 1 2 3 4 3 5 1 симметричными парами назовем пары (1, 1), (2, 5), (3, 3). Число 4 не образует пару, так как оно находится на равном удалении от краев, следовательно, это одно число, а не два.

Найдите количество симметричных пар таких, что среднее арифметическое максимального и минимального значений последовательности строго меньше значения одного элемента пары и строго больше значения второго элемента пары. В качестве ответа запишите количество найденных пар и максимальную сумму элементов среди найденных пар.

Решение

Считываем все данные в список или массив, создаем цикл по половине элементов и анализируем пары, обращаясь к симметричным элементам через обратный или отрицательный индекс.

Python

f = open("17-353.txt")
d = [int(i) for i in f]
a = (max(d) + min(d)) / 2
k = 0
mx = 0
for i in range(len(d) // 2):
    if a > d[i] and a < d[-i - 1] or a < d[i] and a > d[-i - 1]:
        k += 1
        mx = max(mx, d[i] + d[-i - 1])
print(k, mx)

PascalABC

ВНИМАНИЕ!!! При нумерации массива от 1, формула обратного индекса отличается от формулы с нумерацией массива от 0.

var
    n, k, max, min, i: Integer;
    a: Real;
    d: array [1..10000] of Integer;
    f: TEXT;
begin
    Assign(f, '17-353.txt');
    Reset(f);
    n := 0;
    max := 0;
    min := 10001;
    while not eof(f) do
    begin
        n := n + 1;
        Readln(f, d[n]);
        if d[n] > max then
            max := d[n];
        if d[n] < min then
            min := d[n];
    end;
    a := (max + min) / 2;
    k := 0;
    max := 0;
    for i := 1 to n div 2 do
        if (a > d[i]) and (a < d[n - i + 1]) or (a < d[i]) and (a > d[n - i + 1]) then
        begin
            k := k + 1;
            if d[i] + d[n - i + 1] > max then
                max := d[i] + d[n - i + 1];
        end;
    Writeln(k, ' ', max);
end.

C++

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream f;
    f.open("17-353.txt");
    int d[10000];
    int z, n = 0, min = 10001, max = 0;
    while (f >> z)
    {
        d[n++] = z;
        if (z > max)
            max = z;
        if (z < min)
            min = z;
    }
    float a = min + max;
    a /= 2;
    int k = 0;
    max = 0;
    for (int i = 0; i < n / 2; i++)
        if (a > d[i] && a < d[n - i - 1] || a < d[i] && a > d[n - i - 1])
        {
            k++;
            if (max < d[i] + d[n - i - 1])
                max = d[i] + d[n - i - 1];
        }
    cout << k << " " << max << endl;
}

Ответ

2120 14972

Отправить замечание по решению

Код по которому имеется замечание:

Ваш вариант кода:

Комментарий: