После окончания эксперимента передаётся контрольное значение – наибольшее число R
По каналу связи передаются положительные целые числа, не превышающие 1000 – результаты измерений, полученных в ходе эксперимента (количество измерений N известно заранее, гарантируется, что 2 < N ≤ 10000). После окончания эксперимента передаётся контрольное значение – наибольшее число R, удовлетворяющее следующим условиям.
1. R – сумма двух различных переданных элементов последовательности («различные» означает, что нельзя просто удваивать переданные числа, суммы различных, но равных по величине элементов допускаются).
2. R кратно 3.
3. Если в последовательности нет двух чисел, сумма которых кратна 3, контрольное значение считается равным 1.
В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены. Напишите эффективную, в том числе по используемой памяти, программу, которая будет проверять правильность контрольного значения. Программа должна напечатать отчёт по следующей форме:
Вычисленное контрольное значение: …
Контроль пройден (или Контроль не пройден)
Задача А. Напишите программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Максимальная оценка за выполнение задания А – 2 балла.
Задача Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).
На вход программе в первой строке подаётся количество чисел N (2 < N ≤ 10000). В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. В последней строке записано контрольное значение.
Пример входных данных:
6
100
8
33
145
19
84
153
Пример выходных данных для приведённого выше примера входных данных:
Вычисленное контрольное значение: 153
Контроль пройден
Решение:
Чтобы сумма двух чисел делилась на 3, они оба должны делиться на 3 либо сумма их остатков от деления на 3 должна быть равна 3.
Задача А. Pascal (2б)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
const d = 9; var R, R0, i, j, N: longint; a: array[1..10000] of integer; begin readln(N); for i := 1 to N do readln(a[i]); { поиск контрольного значения } R := 0; for i := 1 to N do for j := 1 to i-1 do if ((a[i]+a[j]) mod 3 = 0) and (a[i]+a[j] > R) then R:= a[i]+a[j]; readln(R0); if R = 0 then R:=1; writeln('Вычисленное контрольное значение: ', R); if R = R0 then writeln('Контроль пройден') else writeln('Контроль не пройден'); end. |
Python (2б)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
a = [] n = int(input()) for i in range(n): a.append(int(input())) m = -1 d = 1 for i in range(0, n - d): for j in range(i + d, n): if (a[i] + a[j]) % 3 == 0 and a[i] + a[j] > m: m = a[i] + a[j] R = int(input()) if m == -1: m = 1 print('Вычисленное контрольное значение:', m) if m == R: print('Контроль пройден') else: print('Контроль не пройден') |
Задача Б. (4б)
|
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 |
var R, R0, i, max1, max2, max3a, max3b, N, x: longint; begin readln(N); max1 := 0; max2 := 0; max3a := 0; max3b := 0; for i := 1 to N do begin readln(x); if x mod 3 = 0 then begin if x > max3a then begin max3b:= max3a; max3a:= x end else if x > max3b then max3b:=x; end; if x mod 3 = 1 then if x > max1 then max1:=x; if x mod 3 = 2 then if x > max2 then max2:=x; end; R := 1; if max1*max2 > 0 then R:= max1+max2; if (max3b > 0) and (max3a+max3b > R) then R:=max3a+max3b; readln(R0); if R > 0 then writeln('Вычисленное контрольное значение: ', R); if (R > 0) and (R = R0) then writeln('Контроль пройден') else writeln('Контроль не пройден'); end. |