Задача 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