Демонстрационный вариант ЕГЭ 2019 – задание №27— На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны.
Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4 (разница в индексах элементов пары должна быть 4 или более, порядок элементов в паре неважен).
Необходимо определить количество таких пар, для которых произведение элементов делится на 29.
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (4 ≤ N ≤ 1000).
В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна вывести одно число: количество пар элементов, находящихся в последовательности на расстоянии не меньше чем 4, в которых произведение элементов кратно 29.
Пример входных данных:
7
58
2
3
5
4
1
29
Пример выходных данных для приведённого выше примера входных данных:
5
Пояснение. Из 7 заданных элементов с учётом допустимых расстояний между ними можно составить 6 произведений: 58·4, 58·1, 58·29, 2·1, 2·29, 3·29. Из них на 29 делятся 5 произведений.
Требуется написать эффективную по времени и памяти программу для решения описанной задачи.
Программа считается эффективной по времени, если при увеличении количества исходных чисел N в k раз время работы программы увеличивается не более чем в k раз.
Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает 1 килобайта и не увеличивается с ростом N.
Максимальная оценка за правильную (не содержащую синтаксических ошибок и дающую правильный ответ при любых допустимых входных данных) программу, эффективную по времени и памяти, – 4 балла.
Максимальная оценка за правильную программу, эффективную только по времени, – 3 балла.
Максимальная оценка за правильную программу, не удовлетворяющую требованиям эффективности, – 2 балла
Вы можете сдать одну программу или две программы решения задачи (например, одна из программ может быть менее эффективна). Если Вы сдадите две программы, то каждая из них будет оцениваться независимо от другой, итоговой станет бо́льшая из двух оценок.
Перед текстом программы обязательно кратко опишите алгоритм решения.
Укажите использованный язык программирования и его версию
Решение:
Содержание верного ответа
(допускаются иные формулировки ответа, не искажающие его смысла)
Произведение двух чисел делится на 29, если хотя бы один из сомножителей делится на 29.
При вводе чисел можно подсчитывать количество чисел, кратных 29, не считая четырёх последних. Обозначим их n29.
Примечание для проверяющего. Сами числа, кроме четырёх последних, при этом можно не хранить.
Очередное считанное число будем рассматривать как возможный правый элемент искомой пары.
Если очередное считанное число делится на 29, то к ответу следует прибавить количество чисел до него, не считая четырёх последних (включая считанное).
Если очередное считанное число на 29 не делится, то к ответу следует прибавить n29.
Чтобы построить программу, эффективную по памяти, заметим, что, поскольку при обработке очередного элемента входных данных используются значения, находящиеся на четыре элемента ранее, достаточно
хранить только четыре последних элемента или информацию о них.
Ниже приведена реализующая описанный алгоритм программа на языке Паскаль (использована версия PascalABC)
Пример 1. Программа на языке Паскаль. Программа эффективна по времени и памяти
const s = 4; {требуемое расстояние между элементами}
var
n: longint;
a: array[1..s] of longint; {хранение последних s значений}
a_: longint; {очередное значение}
n29: longint; {количество делящихся на 29 элементов,
не считая s последних}
cnt: longint; {количество искомых пар}
i, j: longint;
begin
readln(n);
{Ввод первых s чисел}
for i:=1 to s do
readln(a[i]);
{Ввод остальных значений, подсчет искомых пар}
cnt := 0;
n29 := 0;
for i := s + 1 to n do
begin
if a[1] mod 29 = 0 then
n29 := n29 + 1;
readln(a_);
if a_ mod 29 = 0 then
cnt := cnt + i - s
else
cnt := cnt + n29;
{сдвигаем элементы вспомогательного массива влево}
for j := 1 to s - 1 do
a[j] := a[j + 1];
a[s] := a_ {записываем текущий элемент в конец массива}
end;
writeln(cnt)
end.
Комментарии для проверяющего
1. При таком решении хранятся только последние 4 прочитанных элемента.
Таким образом, используемая память не зависит от длины последовательности. Время обработки очередного числа фиксировано, т.е. не зависит от длины последовательности. Поэтому при увеличении
длины последовательности в k раз время работы программы увеличивается не более чем в k раз. Таким образом, приведённая выше программа эффективна как по времени, так и по используемой памяти. Это решение оценивается в 4 балла.
В такой версии Паскаля, как PascalABC или Delphi, тип longint может быть заменён на тип integer. В большинстве версий языков C\C++ также можно использовать тип int.
Программа может быть и ещё более эффективной, если на каждом шаге не сдвигать элементы вспомогательного массива, а записывать i-й считанный элемент в элемент с индексом i mod 4 (Паскаль) или i % 4 (Python), ведя нумерацию обоих индексов с нуля. Учёту подлежит элемент с этим же индексом (именно он находится на расстоянии s от i-го и будет заменён на него). Кроме того, при нумерации индексов элементов с нуля меняется одна из формул для подсчёта.
Такая программа на языке Python приведена ниже (пример 2).
Все подобные программы оцениваются, исходя из максимального балла – 4 (см. критерии).
Вместо последних 4 элементов можно хранить и 4 счётчика: количество делящихся на 29 среди всех считанных чисел, всех считанных чисел без последнего, всех считанных чисел без 2 последних, всех считанных чисел без 3 последних, – и также сдвигать их после очередного шага. Такая программа приведена на языке С++ (пример 3). В этом же примере вместо вспомогательного массива длиной 4 используются 4 переменные.
2. Возможно решение, основанное на описанных идеях, однако предварительно сохраняющее элементы последовательности в массив. Такое решение эффективно по времени, но неэффективно по памяти. Оно
оценивается, исходя из максимального балла – 3 (см. критерии).
3. Решение, неэффективное ни по времени, ни по памяти, запоминает входную последовательность в массиве, после чего явно перебирает все возможные пары. Такое решение оценивается, исходя из максимального балла – 2 (см. критерии).
Пример 2. Программа на языке Python. Программа эффективна по времени и памяти
s = 4
a = [0]*s
n = int(input())
for i in range(s):
a[i] = int(input())
cnt = 0
n29 = 0
for i in range(s, n):
k = i % s
if a[k] % 29 == 0:
n29 = n29 + 1
a_ = int(input())
if a_ % 29 == 0:
cnt = cnt + i - s + 1
else:
cnt = cnt + n29
a[i % s] = a_
print(cnt)
Пример 3. Программа на языке С++. Программа эффективна по времени и памяти
#include <iostream>
using namespace std;
int main()
{
int s = 4; //требуемое расстояние между элементами
int n;
int n1 = 0, n2 = 0, n3 = 0, n4 = 0;
//хранение последних s счетчиков
int a_; // очередное значение
int cnt; // количество искомых пар
cin >> n;
cnt = 0;
for (int i = 0; i < n; ++i)
{
cin >> a_; // считано очередное значение
if (i >= s)
{
if (a_ % 29 == 0)
cnt += i - s + 1;
else
cnt += n4;
}
//сдвигаем элементы счетчиков
n4 = n3;
n3 = n2;
n2 = n1;
//обновляем счетчик кратных 29
if (a_ % 29 == 0)
n1 += 1;
}
cout << cnt;
return 0;
}
Указания по оцениванию
Если в работе представлены две программы решения задачи, то каждая из них независимо оценивается по указанным ниже критериям, итоговой считается бо́льшая из двух оценок. Описание алгоритма решения без программы оценивается в 0 баллов
Баллы — 4
Программа правильно работает для любых входных данных произвольного размера при условии исправления в ней не более трёх синтаксических ошибок из приведённого ниже списка допустимых ошибок. Используемая память не зависит от количества прочитанных чисел, а время работы пропорционально
этому количеству.
Допускается наличие в тексте программы до трёх синтаксических ошибок одного из следующих видов:
1) пропущен или неверно указан знак пунктуации;
2) неверно написано, пропущено или написано лишнее зарезервированное слово языка программирования;
3) не описана или неверно описана переменная;
4) применяется операция, не допустимая для соответствующего типа данных.
Если одна и та же ошибка встречается несколько раз, это считается за одну ошибку
Баллы — 3
Не выполнены условия, позволяющие поставить 4 балла.
Программа работает правильно для любых входных данных произвольного размера при условии исправления в ней не более пяти синтаксических ошибок из приведённого в критериях на 4 балла списка и не более одной ошибки из приведённого ниже списка содержательных ошибок. Время работы пропорционально количеству введённых чисел.
Допускается наличие не более одной содержательной (не являющейся синтаксической) ошибки следующих видов:
1) допущена ошибка при вводе данных, например не считывается значение N, или числа могут быть считаны,
только если будут записаны в одной строке через пробел;
2) неверная инициализация или её отсутствие там, где она необходима;
3) используется неверный тип данных;
4) использована одна переменная (или константа) вместо другой;
5) используется один знак операции вместо другого;
6) используется одно зарезервированное слово языка программирования вместо другого;
7) неверно используется условный оператор, например else относится не к тому условию;
8) отсутствует вывод ответа, или выводится значение не той переменной;
9) выход за границу массива;
10) неверно расставлены операторные скобки.
3 балла также ставится за программу, в которой нет содержательных ошибок, но используемая память зависит от количества прочитанных чисел (например, входные данные запоминаются в массиве, контейнере STL в C++ или другой аналогичной структуре данных)
Пример 4. Программа на языке Паскаль. Программа эффективна по времени и неэффективна по памяти
const s = 4; {требуемое расстояние между элементами}
var
n: longint;
a: array[1..1000] of longint;
n29: longint;
{количество делящихся на 29 элементов, не считая s
последних}
cnt: longint; {количество искомых пар}
i, j: longint;
begin
readln(n);
{Ввод первых s чисел}
for i:=1 to s do
readln(a[i]);
{Ввод остальных значений, подсчет искомых пар}
cnt := 0;
n29 := 0;
for i := s + 1 to n do
begin
readln(a[i]);
if a[i - s] mod 29 = 0 then
n29 := n29 + 1;
if a[i] mod 29 = 0 then
cnt := cnt + i - s
else
cnt := cnt + n29;
end;
writeln(cnt)
end.
Баллы — 2
Не выполнены условия, позволяющие поставить 3 или 4 балла.
Программа работает верно, эффективно по времени при условии исправления не более трёх содержательных ошибок, описанных в критериях на 3 балла, и не более девяти синтаксических ошибок,
указанных в критериях на 4 балла.
2 балла также ставится за корректное переборное решение, в котором все числа сохраняются в массиве (или другой аналогичной структуре), рассматриваются все возможные пары и подсчитывается количество подходящих произведений с учётом допустимого расстояния между ними. Пример фрагмента
соответствующей программы на языке Паскаль:
cnt := 0;
for i := 1 to N - s do
for j := i + s to N do
if a[i] * a[j] mod 29 = 0 then
cnt := cnt + 1;
writeln(cnt)
Python
a = []
n = int(input())
for i in range(0, n):
a.append(int(input()))
d = 4
count = 0
for i in range(0, n - d):
for j in range(i + d, n):
if a[i] * a[j] % 29 == 0:
count += 1
print(count)
Не допускается выставление 2 баллов за реализацию переборного алгоритма, содержащего любую логическую ошибку, например ошибку, приводящую к выходу индексов за границы массива, или
ошибку, когда учитываются произведения вида a[i]*a[i], или пары считаются дважды, или неверно учитывается расстояние между индексами элементов пары
Баллы — 1
Не выполнены условия, позволяющие поставить 2, 3 или 4 балла.
При этом в программе должны присутствовать два обязательных элемента, возможно, реализованных с ошибками:
1) проверка делимости (в явной или неявной форме) элементов входной последовательности на заданное число;
2) проверка или учёт того, что расстояние между элементами искомой пары должно быть не меньше заданного
Баллы — 0
Не выполнены критерии, позволяющие поставить 1, 2, 3 или 4 балла
Досрочный вариант ЕГЭ 2018 по информатике
На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны.
Рассматриваются все пары различных элементов последовательности (элементы пары не обязаны стоять в последовательности рядом, порядок элементов в паре не важен). Необходимо определить количество пар, для которых произведение элементов не делится на 34.
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (1≤N≤1000).
В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000. В качестве результата программа должна напечатать одно число: количество пар, в которых произведение элементов не кратно 34.
Пример входных данных:
5
3
4
10
11
17
Пример выходных данных для приведённого выше примера входных данных:
8
Пояснение. Из заданных чисел можно составить 10 попарных произведений: 3·4, 3·10, 3·11, 3·17, 4·10, 4·11, 4·17, 10·11, 10·17, 11·17 (результаты: 12, 30, 33, 51, 40, 44, 68, 110, 170, 187). Из них на 34 не
делятся 8 произведения (3·4=12, 3·10=30, 3·11=33, 3·17=51, 4·10=40, 4·11=44, 10·11=110, 11·17=187).
Требуется написать эффективную по времени и по памяти программу для решения описанной задачи.
Программа считается эффективной по времени, если при увеличении количества исходных чисел N в k раз время работы программы увеличивается не более чем в k раз.
Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает 1 Кбайт и не увеличивается с ростом N.
Максимальная оценка за правильную (не содержащую синтаксических ошибок и дающую правильный ответ при любых допустимых входных данных) программу, эффективную по времени и по памяти, – 4 балла.
Максимальная оценка за правильную программу, эффективную только по времени – 3 балла.
Максимальная оценка за правильную программу, не удовлетворяющую требованиям эффективности, – 2 балла
Решение:
Программа на языке Pascal. (4б)
var
i,n,x,k2,k17,k34,n34,R: integer;
begin
readln(n);
k2:=0;k17:=0;k34:=0;
for i:=1 to n do
begin
readln(x);
if (x mod 34=0) then inc(k34)
else if (x mod 17 =0) then inc(k17)
else if (x mod 2=0) then inc(k2);
end;
n34:=n-k34; {количество чисел, не кратное 34}
R:=(n*(n-1) div 2) - k34*n34 - k2*k17 - k34*(k34-1) div 2;
writeln(R);
end.
Программа на языке C++. (4б)
#include <iostream>
using namespace std;
int main() {
int i,n,x,k2,k17,k34,n34,R;
cin>>n;
k2=0;k17=0;k34=0;
for(i=1;i<=n;i++){
cin>>x;
if (x % 34 == 0)
k34++;
else if (x % 17 == 0)
k17++;
else if (x % 2 == 0)
k2++;
}
n34=n-k34; //количество чисел, не кратное 34
R=(n*(n-1) / 2) - k34*n34 - k2*k17 - k34*(k34-1) / 2;
cout<<R;
return 0;
}
Программа на языке Python. (2б)
a = []
n = int(input())
for i in range(0, n):
a.append(int(input()))
d = 1
count = 0
for i in range(0, n - d):
for j in range(i + d, n):
if a[i] * a[j] % 34 != 0:
count += 1
print(count)
Досрочный вариант ЕГЭ 2017 по информатике вариант_101
На спутнике «Восход» установлен прибор, предназначенный для измерения солнечной активности. В течение времени эксперимента (это время известно заранее) прибор каждую минуту передаёт в обсерваторию по каналу связи положительное целое число, не превышающее 1000, – количество энергии солнечного излучения, полученной за последнюю минуту, измеренное в условных единицах.
После окончания эксперимента передаётся контрольное значение – наибольшее число R, удовлетворяющее следующим условиям:
1) R – произведение двух чисел, переданных в разные минуты;
2) R делится на 26.
Предполагается, что удовлетворяющее условиям контрольное значение существовало в момент передачи.
В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены.
Напишите эффективную по времени и используемой памяти программу (укажите используемую версию языка программирования, например Free Pascal 2.6.4), которая будет проверять правильность контрольного значения.
Программа считается эффективной по времени, если время работы программы пропорционально количеству полученных показаний прибора N, т.е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз.
Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.
Программа должна напечатать отчёт по следующей форме.
Вычисленное контрольное значение: …
Контроль пройден (или Контроль не пройден)
Если удовлетворяющее условию контрольное значение определить невозможно, то выводится только фраза «Контроль не пройден».
Перед текстом программы кратко опишите используемый Вами алгоритм решения.
На вход программе в первой строке подаётся количество чисел N ≤ 100 000.
В каждой из последующих N строк записано одно положительное целое число, не превышающее 1000. В последней строке записано контрольное значение.
Пример входных данных:
5
52
12
39
55
23
2860
Пример выходных данных для приведённого выше примера входных данных:
Вычисленное контрольное значение: 2860
Контроль пройден
Решение:
на 2 балл C++
#include <iostream>
using namespace std;
#define K 100000
int main(){
int i,j,N,max,R;
int a[K];
cin>>N;
for(i=1;i<=N;i++)
cin>>a[i];
max=-1;
for(i=1;i<=N-1;i++)
for(j=i+1;j<=N;j++)
if((a[i]*a[j])%26==0 && a[i]*a[j]>max)
max=a[i]*a[j];
cin>>R;
if(max>0)
cout<<"Вычисленное контрольное значение:"<<max<<endl;
if(R==max)
cout<<"Контроль пройден"
else
cout<<"Контроль не пройден";
return 0;
}
на 2 балл Python
a = []
n = int(input())
for i in range(0, n):
a.append(int(input()))
d = 1
mx = -1
for i in range(0, n - d):
for j in range(i + d, n):
if a[i] * a[j] % 26 == 0 and a[i] * a[j] > mx:
mx = a[i] * a[j]
R = int(input())
if mx > 0:
print('Вычисленное контрольное значение:', mx)
if mx == R:
print('Контроль пройден')
else:
print('Контроль не пройден')
на 4 балл C++
#include <iostream>
using namespace std;
int main(){
int М2, M13, M26, R, max, x, kontrol, i, N;
M2 = 0; M13 = 0; M26 = 0; max = 0;
cin>>N;
for(i = 1; i <= N; i++){
cin>>x;
if (x % 2 == 0 && x % 13 > 0 && x > M2)
M2 = x;
if (x % 13 == 0 && x % 2 > 0 && x > M13)
M13 = x;
if (x % 26 == 0 && x > M26){
if (M26 > max)
max = M26;
M26 = x;
}
else if (x > max)
max = x;
}
cin>>R;
if (M2*M13 < M26*max)
kontrol = M26*max;
else
kontrol = M2*M13;
if(kontrol > 0)
cout<<"Вычисленное контрольное значение:"<<kontrol<<endl;
if (R == kontrol)
cout<<"Контроль пройден";
else
cout<<"Контроль не пройден";
return 0;
}
Дан набор из N целых положительных чисел. Необходимо выбрать из набора произвольное количество чисел так, чтобы их сумма была как можно больше и при этом не делилась на 4. В ответе нужно указать количество выбранных чисел и их сумму, сами числа выводить не надо. Если получить нужную сумму невозможно, считается, что выбрано 0 чисел и их сумма равна 0.
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (1 ≤ N ≤ 1000).
В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.
Пример входных данных:
3
1
6
5
В результате работы программа должна вывести два числа: сначала количество выбранных чисел, затем их сумму.
Пример выходных данных для приведённого выше примера входных данных:
2 11
В данном случае из предложенного набора нужно выбрать два числа (6 и 5), их сумма равна 11.
Источник: onlyege
Решение:
Если сумма всех данных чисел не кратна 4, нужно просто взять все числа.
Если сумма кратна 4, нужно удалить из неё минимально возможный элемент – наименьшее из заданных чисел, не кратное 4. Если таких чисел нет (все числа в наборе кратны 4), то получить требуемую сумму невозможно, в этом случае по условию задачи ответ считается равным нулю.
#include <iostream>
using namespace std;
const int d = 4; //делитель}
const int amax = 10000; //максимально возможное число
int main() {
int N; //количество чисел
int a; //очередное число
int s; //сумма
int mn; //минимальное число, не кратное d
int k; //количество выбранных чисел
int i;
cin >> N;
s = 0;
mn = amax+1;
for(i=0; i<N; i++){
cin>>a;
s = s+a;
if (a % d != 0 && a < mn)
mn = a;
}
if (s % d != 0)
k = N;
else if (mn <= amax){
k = N-1;
s = s - mn;
}
else {
k = 0;
s = 0;
}
cout<<k<<" "<<s;
return 0;
}
Дан набор из N неотрицательных целых чисел, меньших 1000. Для каждого числа вычисляется сумма цифр его десятичной записи. Необходимо определить, какая сумма цифр реже всего встречается у чисел этого набора. Если таких сумм несколько, нужно вывести наименьшую из них.
Источник: onlyege
Решение:
Программа на языке C++. (4б)
#include <iostream>
using namespace std;
int main(){
int N; //количество чисел
int x; //очередное число
int k[28]; //подсчёт сумм
int imn; //самая редкая сумма
int mn; //количество повторений суммы
int i;
for(i=0;i<=27;i++)
k[i]=0;
cin>>N;
for(i=0;i<N;i++){
cin>>x;
k[x/100+x/10%10+x%10]++;
}
mn=10001;
for(i=0;i<=27;i++)
if (k[i]<mn && k[i]!=0){
mn=k[i];
imn=i;
}
cout<<imn;
return 0;
}
Дан набор из N целых положительных чисел. Из этих чисел формируются все возможные пары (парой считаются два элемента, которые находятся на разных местах в наборе, порядок чисел в паре не учитывается), в каждой паре вычисляется сумма элементов. Необходимо определить количество пар, для которых полученная сумма делится на 12.
Источник: onlyege
Решение:
Чтобы сумма двух чисел делилась на 12, они оба должны делиться на 12 либо сумма их остатков от деления на 12 должна быть равна 12.
Программа на языке C++. (4б)
#include <iostream>
using namespace std;
int main(){
int N; //количество чисел
int a; //очередное число
int d[12]; // группы по остаткам
int s; //количество пар
int i;
for (i=0;i<=11;i++)
d[i]=0;
cin>>N;
for(i=0;i<N;i++){
cin>>a;
d[a%12]++;
}
s = (d[0]*(d[0]-1) + d[6]*(d[6]-1)) / 2;
for(i=1;i<=5;i++)
s += d[i]*d[12-i];
cout<<s;
return 0;
}
По каналу связи передаются положительные целые числа, не превышающие 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б)
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б)
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б)
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.
Последовательность На спутнике «Восход» установлен прибор, предназначенный для измерения солнечной активности. Каждую минуту прибор передаёт по каналу связи неотрицательное целое число – количество энергии солнечного излучения, полученной за последнюю минуту, измеренное в условных единицах. Временем, в течение которого происходит передача, можно пренебречь. Необходимо найти в заданной
серии показаний прибора максимальное чётное произведение двух показаний, между моментами передачи которых прошло не менее 9 минут.
Если получить такое произведение не удаётся, ответ считается равным –1.
Количество энергии, получаемое прибором за минуту, не превышает 1000 условных единиц. Общее количество показаний прибора в серии не превышает 10 000.
Задача А. Напишите программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Максимальная оценка за выполнение задания А – 2 балла.
Задача Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).
Входные данные представлены следующим образом. В первой строке задаётся число N – общее количество показаний прибора. Гарантируется, что N > 9. В каждой из следующих N строк задаётся одно положительное
целое число – очередное показание прибора.
Пример входных данных:
11
12
45
5
3
17
23
21
20
19
12
26
Программа должна вывести одно число – описанное в условии произведение либо –1, если получить такое произведение не удаётся.
Пример выходных данных для приведённого выше примера входных данных: 1170
Решение:
Задача А. (2б)
const d = 9;
var N: integer;
a: array[1..10000] of integer;
i, j, max: integer;
begin
readln(N);
for i:=1 to N do read(a[i]);
max:= -1;
for i:= 1 to N-d do
for j:= i+d to N do
if (a[i]*a[j] mod 2 = 0) and
(a[i]*a[j] > max) then
max := a[i]*a[j];
writeln(max)
end.
Задача Б. (4б)
const d = 9;
var N: integer;
a: array[0..d-1] of integer;
max, m, mEven, x, j, i: integer;
begin
readln(N);
for j:=0 to d-1 do read(a[j]);
max:= -1;
m:= -1; mEven:= -1;
for j:= d to N-1 do begin
read(x);
if ((a[j mod d] mod 2 = 0) and
(a[j mod d] > mEven)) then mEven:= a[j mod d];
if (a[j mod d] > m) then m := a[j mod d];
if x mod 2 = 1 then begin
if x*mEven > max then max := mEven*x;
end
else
if x*m > max then max := m*x;
a[j mod d]:=x;
end;
writeln(max)
end.