Имеется набор данных, состоящий из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 3 и при этом была минимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число – минимально возможную сумму, соответствующую условиям задачи.
Входные данные:
Даны два входных файла: файл A (27-1a.txt) и файл B (27-1b.txt), каждый из которых содержит в первой строке количество пар N (1 ≤ N ≤ 100000). Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000.
Пример входных данных:
6
1 3
5 12
6 9
5 4
3 3
1 1
Пример выходных данных для приведённого выше примера входных данных:
20
Решение:
Язык Python (Питон):
f = open ('27-1b.txt') # для первого ответа - 27-1a.txt
n=int(f.readline())
data=f.readlines()
summa=0
minim=10001 # для минимальной разницы
for i in range(0, n):
s = data[i].split()
a=int(s[0])
b=int(s[1])
summa+=min(a,b) # сумма максимумов из пар
raznitsa = abs(a-b) # разница
if raznitsa % 3 != 0:
minim=min(minim,raznitsa)
if summa % 3 != 0:
print(summa)
else:
print(summa + minim) # здесь добавляем! т.к. иначе берем наибольший из пары |
Ответ: 67303 200157496
Задания предыдущих лет на повторение
На вход программы поступает последовательность чисел, произвести анализ пар
27_4:* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Компьютер наземной станции слежения получает от объектов-самолётов, находящихся в зоне её работы, идентификационные сигналы, представляющие собой последовательность из N целых положительных чисел. Каждый объект направляет на наземную станцию уникальное число, т. е. все числа в получаемой станцией последовательности различны. Обработка сигнала представляет собой рассмотрение всех пар различных элементов последовательности, при этом элементы пары не обязаны быть переданы непосредственно друг за другом, порядок элементов в паре не важен. Считается, что возникла одна критическая ситуация, если произведение элементов некоторой пары кратно 58.
Необходимо определить общее количество возникших критических ситуаций.
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (1 < N < 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна напечатать одно число: общее количество возникших критических ситуаций.
Пример входных данных:
4
2
6
29
87
Пример выходных данных для приведённого выше примера входных данных:
4
Из четырёх заданных чисел можно составить б попарных произведений:
2*6 = 12
2*29 = 58
2*87 = 174
6*29 = 174
6*87 = 522
29*87 = 2523
Из них на 58 делятся 4 произведения (выделены синим).
Требуется написать эффективную по времени и по памяти программу для решения описанной задачи.
✎ Программа эффективна по времени и по памяти (4 балла):- Язык Паскаль (версия PascalABC):
var
N: integer; {количество чисел}
a: integer; {очередное число}
n58, n29, n2: integer;
k58: integer; {количество требуемых пар}
i: integer;
begin
readln(N);
n58 := 0;
n29 := 0;
n2 := 0;
for i := 1 to N do
begin
readln(a);
if a mod 58 = 0 then
n58 := n58 + 1
else if a mod 29 = 0 then
n29 := n29 + 1
else if a mod 2 = 0 then
n2 := n2 + 1;
end;
k58 := n58 * (n58 - 1) div 2 + n58 * (N - n58) + n2 * n29;
writeln(k58)
end. |
- Язык Python (версия Python 3):
n=int(input())
n58,n29,n2=0,0,0
for i in range(n):
a=int(input())
if a % 28 == 0:
n58+=1
elif a % 29 == 0:
n29+=1
elif a % 2 == 0:
n2+=1
k58=n58 * (n58-1) // 2 + n58 * (n-n58) + n2 * n29
print(k58) |
- Язык Бейсик:
N58 = 0
N2 = 0
N29 = 0
NX = 0
INPUT N
FOR I = 1 TO N
INPUT A
IF A MOD 58 = 0 THEN
N58 = N58 + 1
ELSE
IF A MOD 29 = 0 THEN
N29 = N29 + 1
ELSE
IF A MOD 2 = 0 THEN
N2 = N2 + 1
ELSE NX = NX + 1
END IF
END IF
END IF
NEXT I
K58 = N58*(N58 - 1)\2 + N58*(N2 + N29 + NX) + N2*N29
PRINT K58 |
- Произведение двух чисел делится на 58, если выполнено одно из следующих условий (условия не могут выполняться одновременно).
- A. Оба сомножителя делятся на 58.
- Б. Один из сомножителей делится на 58, а другой не делится.
- B. Ни один из сомножителей не делится на 58, но один сомножитель делится на 2, а другой — на 29.
- Почему именно 2 и 29?
- Берем два делителя числа 58, произведение которых дает число 58: 2*29 = 58. При этом одно из них — наименьший делитель (в нашем случае 2), а другой, не должен делиться на первый найденный делитель (29/2 <> 0).
- Условие делимости произведения на 58 можно сформулировать проще, например так:
(один из сомножителей делится на 58)
ИЛИ
(один сомножитель делится на 2, а другой — на 29)
- Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар.
- При вводе чисел можно определять, делится ли каждое из них на 58, 2 и 29, и подсчитывать следующие значения:
- n58 — количество чисел, кратных 58;
- n29 —количество чисел, кратных 29, но не кратных 2 и 58;
- n2 — количество чисел, кратных 2, но не кратных 29 и 58.
- Сами числа при этом можно не хранить. Каждое число учитывается не более чем в одном из счётчиков.
- Количество пар, удовлетворяющих условию А, можно вычислить по формуле
n58*(n58 - 1)/2. - Количество пар, удовлетворяющих условию Б, можно вычислить по формуле
n58*(N - n58). - Количество пар, удовлетворяющих условию В, можно вычислить по формуле
n2 * n29. - Поэтому искомое количество пар вычисляется по формуле:
n58 * (n58 - 1)/2 + n58 * (N - n58) + n2 * n29
✎ Программа неэффективная (2 балла):
- Язык Паскаль (версия PascalABC):
var
i, j, k, n: integer;
a: array[1..1000]of integer;//очередное значение
begin
readln(n);
for i := 1 to n do
begin
readln(a[i]);
end;
k := 0;
for i := 1 to n - 1 do
for j := i + 1 to n do
if a[i] * a[j] mod 58 = 0 then
k := k + 1;
writeln(k);
end. |
Полный перебор: все числа сохраняются в массиве, рассматриваются все возможные пары и подсчитывается количество подходящих произведений.
27_6: Разбор 27 задания демоверсии 2018 года:* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности (элементы пары не обязаны стоять в последовательности рядом, порядок элементов в паре не важен). Необходимо определить количество пар, для которых произведение элементов делится на 26.
Описание входных и выходных данных В первой строке входных данных задаётся количество чисел N (1 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна напечатать одно число: количество пар, в которых произведение элементов кратно 26.
Пример входных данных:
4
2
6
13
39
Пример выходных данных для приведённого выше примера входных данных:
4
Из четырёх заданных чисел можно составить 6 попарных произведений:
2·6 = 12
2·13 = 26
2·39 = 78
6·13 = 78
6·39 = 234
13·39 = 507
Из них на 26 делятся 4 произведения:
2·13=26;
2·39=78;
6·13=78;
6·39=234
Требуется написать эффективную по времени и по памяти программу для
решения описанной задачи.
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Произведение двух чисел делится на 26, если выполнено одно из следующих условий (условия не могут выполняться одновременно).
А. Оба сомножителя делятся на 26.
Б. Один из сомножителей делится на 26, а другой не делится.
В. Ни один из сомножителей не делится на 26, но один сомножитель делится на 2, а другой – на 13.Примечание для проверяющего. Условие делимости произведения на 26 можно сформулировать проще, например, так:
(один из сомножителей делится на 26) ИЛИ
(один сомножитель делится на 2, а другой – на 13).
Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар.
При вводе чисел можно определять, делится ли каждое из них на 26, 2 и 13, и подсчитывать следующие значения:
1) n26 – количество чисел, кратных 26;
2) n13 – количество чисел, кратных 13, но не кратных 26;
3) n2 – количество чисел, кратных 2, но не кратных 26.
Примечание для проверяющего. Сами числа при этом можно не хранить.
Каждое число учитывается не более чем в одном из счётчиков.
Количество пар, удовлетворяющих условию А, можно вычислить по формуле
n26·(n26 – 1)/2.
Количество пар, удовлетворяющих условию Б, можно вычислить по формуле
n26·(N – n26).
Количество пар, удовлетворяющих условию В, можно вычислить по формуле
n2·n13.
Поэтому искомое количество пар вычисляется по формуле
n26·(n26 – 1)/2 + n26·(N – n26) + n2·n13
✎ Программа эффективна и по времени, и по памяти (4 балла):
Программа на языке Паскаль (версия PascalABC):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| var
N: integer; {количество чисел}
a: integer; {очередное число}
n26, n13, n2: integer;
k26: integer; {количество требуемых пар}
i: integer;
begin
readln(N);
n26 := 0;n13 := 0;n2 := 0;
for i := 1 to N do
begin
readln(a);
if a mod 26 = 0 then
n26 := n26 + 1
else if a mod 13 = 0 then
n13 := n13 + 1
else if a mod 2 = 0 then
n2 := n2 + 1;
end;
k26 := n26 * (n26 - 1) div 2 + n26 * (N - n26) + n2 * n13;
writeln(k26)
end. |
Программа на языке Python (версия Python 3):
1
2
3
4
5
6
7
8
9
10
11
12
| n=int(input())
n26,n13,n2=0,0,0
for i in range(n):
a=int(input())
if a % 26 == 0:
n56+=1
elif a % 13 == 0:
n13+=1
elif a % 2 == 0:
n2+=1
k26=n26 * (n26-1) // 2 + n26 * (n-n26) + n2 * n13
print(k26) |
Программа на языке Бейсик:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| N26 = 0
N2 = 0
N13 = 0
NX = 0
INPUT N
FOR I = 1 TO N
INPUT A
IF A MOD 26 = 0 THEN
N26 = N26 + 1
ELSE
IF A MOD 13 = 0 THEN
N13 = N13 + 1
ELSE
IF A MOD 2 = 0 THEN
N2 = N2 + 1
ELSE NX = NX + 1
END IF
END IF
END IF
NEXT I
K26 = N26*(N26 - 1)\2 + N26*(N2 + N13 + NX) + N2*N13
PRINT K26 |
27_7: Разбор досрочного экзамена 2020 г, ФИПИ (2 вариант):* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности, разность которых чётна, и в этих парах, по крайней мере, одно из чисел пары делится на 19. Порядок элементов в паре неважен. Среди всех таких пар нужно найти и вывести пару с максимальной суммой элементов. Если одинаковую максимальную сумму имеет несколько пар, можно вывести любую из них. Если подходящих пар в последовательности нет, нужно вывести два нуля.
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (2 ≤ N ≤ 10 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.
Пример входных данных:
5
38
12
57
16
57
Пример выходных данных для приведённого выше примера входных данных:
57 57
Пояснение. Из данных пяти чисел можно составить три различные пары, удовлетворяющие условию: (38, 12), (38, 16), (57, 57). Наибольшая сумма получается в паре (57, 57). Эта пара допустима, так как число 57 встречается в исходной последовательности дважды.
Напишите эффективную по времени и памяти программу для решения этой задачи.
Программа считается эффективной по времени, если при увеличении количества исходных чисел N в k раз время работы программы увеличивается не более чем в k раз.
Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает 1 Кбайт и не увеличивается с ростом N.
Максимальная оценка за правильную (не содержащую синтаксических ошибок и дающую правильный ответ при любых допустимых входных данных) программу, эффективную по времени и памяти, – 4 балла.
Максимальная оценка за правильную программу, эффективную только по времени или только по памяти, – 3 балла.
Максимальная оценка за правильную программу, не удовлетворяющую требованиям эффективности, – 2 балла.
Вы можете сдать одну или две программы решения задачи. Если Вы сдадите две программы, каждая из них будет оцениваться независимо от другой, итоговой станет бо́льшая из двух оценок.
Перед текстом программы кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию.
Типовые задания для тренировки
Решение:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
- ✎ Программа эффективна по времени и памяти
Язык Pascal (PascalABC):
Вариант 1:
const
p = 19;
var
N: integer; {количество чисел}
a: integer; {очередное число}
m0, m1: integer; {чётный и нечётный максимумы}
mp0, mp1: integer; {чётный и нечётный максимумы, кратные p}
x, y: integer; {ответ – пара чисел}
i: integer;
begin
m0 := 0; m1 := 0;
mp0 := 0; mp1 := 0;
x := 0; y := 0;
readln(N);
for i := 1 to N do
begin
readln(a);
// для четных
if a mod 2 = 0 then
begin
// если кратное
if (a mod p = 0) and (a >= mp0) then
begin
if mp0 > m0 then
m0:= mp0;
mp0:=a
end
else if a > m0 then
m0 := a;
end
else
begin
// для нечетных
if (a mod p = 0)and(a>=mp1) then
begin
if mp1>m1 then
m1:=mp1;
mp1 := a;
end
else if a>m1 then
m1:=a;
end;
end;
// writeln('mp0=', mp0, 'm0=', m0);
if (mp0 > 0) and (m0 > 0) then
begin
x := mp0; y := m0;
end;
// writeln('mp1=', mp1, 'm1=', m1);
if (mp1 > 0) and (m1 > 0) and (mp1 + m1 > x + y) then
begin
x := mp1;
y := m1;
end;
writeln('=', x, ' ', y)
end. |
Язык Pascal (PascalABC):
Вариант 2:
const
p = 19;
var
n, i, x, k19n, k19chet, n19chet, n19n, m1, m2: integer;
begin
readln(n); {количество чисел}
readln(x); {первое число}
// обнуление всех переменных
k19chet := 0; // четный кратный
n19chet := 0; // четный некратный
k19n := 0; // нечетный кратный
n19n := 0; // нечетный некратный
m1 := 0; m2 := 0; // максимальные
// цикл до n - 1, т.к. первое число уже считали
for i := 1 to n - 1 do
begin
// проверка, если четный и кратный
if (x mod p = 0) and (x mod 2 = 0) and (x > k19chet) then
begin
k19chet := x;
end;
// проверка, если четный и некратный
if (x mod p <> 0) and (x mod 2 = 0) and (x > n19chet) then
begin
n19chet := x;
end;
// проверка, если нечетный и кратный
if (x mod p = 0) and (x mod 2 = 1) and (x > k19n) then
begin
k19n := x;
end;
// проверка, если нечетный и некратный
if (x mod p <> 0) and (x mod 2 = 1) and (x > n19n) then
begin
n19n := x;
end;
readln(x); // считываем очередное число
// если x кратно и есть такое некратное n19chet, сумма с которым была бы больше чем m1 + m2
if (x mod p = 0) and ((x + n19chet) mod 2 = 0) and (x + n19chet > m1 + m2) and (n19chet > 0) then
begin
m1 := x; m2 := n19chet;
end;
// если x кратно и есть такое некратное n19n, сумма с которым была бы больше чем m1 + m2
if (x mod p = 0) and ((x + n19n) mod 2 = 0) and (x + n19n > m1 + m2) and (n19n > 0) then
begin
m1 := x; m2 := n19n;
end;
// если есть такое кратное k19n, сумма с которым была бы четной и больше чем m1 + m2
if ((x + k19n) mod 2 = 0) and (x + k19n > m1 + m2) and (k19n > 0) then
begin
m1 := x; m2 := k19n;
end;
// если есть такое кратное k19chet, сумма с которым была бы четной и больше чем m1 + m2
if ((x + k19chet) mod 2 = 0) and (x + k19chet > m1 + m2) and (k19chet > 0) then
begin
m1 := x; m2 := k19chet;
end;
end;
writeln(m1, ' ', m2)
end. |
Язык Python (Python 3):
p = 19
m0 = m1 = mp0 = mp1 = 0
N = int(input())
for i in range(N):
a = int(input())
if a % 2 == 0:
if a % p == 0 and a >= mp0:
if mp0 > m0: m0 = mp0
mp0 = a
elif a > m0: m0 = a
else:
if a % p == 0 and a >= mp1:
if mp1 > m1: m1 = mp1
mp1 = a
elif a > m1: m1 = a
x = y = 0
if mp0 > 0 and m0 > 0:
x = mp0; y = m0
if mp1 > 0 and m1 > 0 and mp1 + m1 > x + y:
x = mp1; y = m1
print(x,y) |
Ещё один путь решения – записать всю последовательность в массив и анализировать её в несколько проходов. Ниже приводится реализующая такой алгоритм программа на языке C++. В этой программе массив с исходными данными обрабатывается два раза: на первом проходе находятся индексы максимального чётного и нечётного элементов, кратных p, на втором проходе – общие чётный и нечётный максимумы. При этом элементы, выделенные как кратные при первом проходе, во время второго прохода из сравнения исключаются. Такая программа эффективна по времени (несмотря на повторную обработку массива, общее время работы пропорционально N), но неэффективна по памяти. Максимальная оценка за такую программу при отсутствии в ней синтаксических и содержательных ошибок – 3 балла.
- ✎ Правильная программа на языке C++, эффективная только по времени
С++:
#include <iostream>
using namespace std;
int main() {
const int p = 19; // делитель
int N; cin >> N; // количество элементов
int a[N]; // элементы последовательности
for (int i = 0; i < N; ++i) cin >> a[i];
int imp0 = -1, imp1 = -1; //индексы максимумов, кратных p
for (int i = 0; i < N; ++i) {
if (a[i] % p == 0) {
if (a[i] % 2 == 0) {
if (imp0 == -1 || a[i] > a[imp0]) imp0 = i;
}
else {
if (imp1 == -1 || a[i] > a[imp1]) imp1 = i;
}
}
}
int im0 = -1, im1 = -1; // индексы общих максимумов
for (int i = 0; i < N; ++i) {
if (i != imp0 && i != imp1) {
if (a[i] % 2 == 0) {
if (im0 == -1 || a[i] > a[im0]) im0 = i;
}
else {
if (im1 == -1 || a[i] > a[im1]) im1 = i;
}
}
}
int x = 0, y = 0; // пара чисел для ответа
if (imp0 != -1 && im0 != -1) {
x = a[imp0]; y = a[im0];
}
if (imp1 != -1 && im1 != -1 && a[imp1] + a[im1] > x + y) {
x = a[imp1]; y = a[im1];
}
cout << x << ' ' << y << endl;
return 0;
} |
- ✎ Правильная, но неэффективная программа на языке Паскаль
Запишем все исходные числа в массив, переберём все возможные пары и выберем подходящую. Такое решение не является эффективным ни по памяти (требуемая память зависит от размера исходных данных), ни по времени (количество возможных пар, а значит, количество действий и время счёта с ростом количества исходных элементов растут квадратично). Подобная программа оценивается не выше 2 баллов.
Язык Pascal (версия PascalABC):
const
p = 19;
var
N: integer; {количество чисел}
a: array [1..10000] of integer; {исходные данные}
x, y: integer; {ответ – пара чисел}
i, j: integer;
begin
readln(N);
for i := 1 to N do readln(a[i]);
x := 0; y := 0;
for i := 1 to N - 1 do
begin
for j := i + 1 to N do
begin
if ((a[i] - a[j]) mod 2 = 0) and
((a[i] mod p = 0) or (a[j] mod p = 0)) and
(a[i] + a[j] > x + y)
then
begin
x := a[i]; y := a[j]
end
end
end;
writeln(x, ' ', y)
end. |
Выбрать из каждой пары одно число
27_1:* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Задание А (более легкое, чем Б)
Имеется набор данных, состоящий из 5 пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма квадратов всех выбранных чисел была нечетной и при этом максимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.
Напишите программу для решения этой задачи. В этом варианте задания оценивается только правильность программы, время работы и размер использованной памяти не имеет значения.
Максимальная оценка за правильную программу — 2 балла.
Задание Б (более сложное, чем А)
Имеется набор данных, состоящих из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма квадратов всех выбранных чисел была нечетной и при этом максимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.
Напишите программу для решения этой задачи.
Постарайтесь сделать программу эффективной по времени, если время работы программы пропорционально количеству пар чисел N, т.е. при увеличении N в k раз время работы программы должно увеличиваться на более чем в k раз.
Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа
N и не превышает
1 килобайта.
Максимальная оценка за правильную программу, эффективную по времени и по памяти, — 4 балла.
Как в варианте А, так и в варианте Б программа должна напечатать одно число — максимально возможную сумму, соответствующую условиям задачи (или 0, если такую сумму получить нельзя).
Например:
2 6
4 1
7 3
2 9
7 4
sum=231
Решение:
✎ Задание Б (алгоритм), более сложное, 4 балла:- поскольку в задании указано, что «имеется набор данных, состоящих из пар…», то введем в программу переменную
n для количества пар, значение которой будет считываться со стандартного входного потока: n:longint; {количество пар чисел}; |
- объявим сами числа типа
integer, переменную цикла — i — типа integer и дополнительные переменные, смысл которых будет объяснен ниже. Объявление сделаем в отдельных строках (так делать не обязательно), чтобы можно было ввести удобно комментарии: x,y: integer; {пара чисел}
max: integer; {максимальное из пары}
min: integer; {минимальное из пары}
sum:longint; {сумма квадратов отобранных чисел}
min_kvadr:longint; {мин. нечетная разница квадратов max и min}
i:integer; |
- так как в задании не оговаривается, что пары чисел считывается из файла, значит их необходимо считать со стандартного входного потока оператором
readln(); т.е. организуем цикл: for i:=1 to n do begin
readln(x,y);
... |
Допустим имеем пары:
2 6
4 1
7 3
2 9
7 4
Чтобы получить в итоге максимальную сумму, то необходимо суммировать те числа из пар чисел, которые максимальны в паре, т.е. в нашем случае будем суммировать квадраты выделенных чисел из пар:2 6
4 1
7 3
2 9
7 4
но сначала определим максимальное и минимальное число из каждой пары:if x>y then
begin
max:=x; min:=y
end
else
begin
max:=y;min:=x
end; |
далее суммируем квадраты максимальных чисел:поскольку, согласно заданию, сумма должна быть нечетной, то в случае, если сумма будет четной, нам необходимо выбрать пару, в которой разница между квадратами чисел минимальна и при этом нечетна и взять из этой пары не максимальный, а минимальный элемент. Или лучше просто вычислить разницу между квадратами максимума и минимума и затем вычесть ее из получившейся четной суммы. Выделим пару, разница между квадратами чисел которой минимальна и при этом нечетна:2 6 - разница 32 (36 - 4)
4 1 - разница 15 (16 - 1)
7 3 - разница 40 (49 - 9)
2 9 - разница 77 (81 - 4)
7 4 - разница 33 (49 - 16)
поиск минимальной и нечетной разницы между квадратами чисел в паре:if((max-min) mod 2 > 0) and ((sqr(max)-sqr(min)) < min_kvadr) then
min_kvadr:=sqr(max) - sqr(min) |
для переменной, обозначающей разницу, до цикла необходимо назначить максимально возможное значение:min_kvadr:=1073676289; {32 767 * 32 767 (самое большое в типе integer) } |
таким образом, в цикле у нас происходит:1. поиск максимального и минимального числа из пары;2. вычисляется сумма максимальных чисел из каждой пары;3. находится минимальная разница квадратов максимального и минимального числа в парах.после цикла необходимо проверить сумму на нечетность. Если сумма четная (чего НЕ должно быть по условию), то отнимем от суммы вычисленную минимальную разницу. Но при этом учтем, что если не нашлось нечетной минимальной разницы, то выводим 0 (по условию):if sum mod 2 = 0 then begin
if min_kvadr = 1073676289 then sum := 0
else sum:=sum - min_kvadr
end; |
Эффективная программа на языке Паскаль (версия Pascal ABC):
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
| var
n:longint; {количество пар чисел}
x,y: integer; {пара чисел}
max: integer; {максимальное из пары}
min: integer; {минимальное из пары}
sum:longint; {сумма квадратов отобранных чисел}
min_kvadr:longint; {мин. нечетная разница квадратов max и min}
i:integer;
begin
sum:=0;
readln(n);
min_kvadr:=1073676289; {32 767 * 32 767, самое большое integer}
for i:=1 to n do begin
readln(x,y);
if x>y then begin max:=x; min:=y end
else begin max:=y;min:=x end;
sum:=sum+sqr(max);
if((max-min) mod 2 > 0) and (sqr(max)-sqr(min) < min_kvadr) then
min_kvadr:=sqr(max) - sqr(min)
end;
if sum mod 2 = 0 then begin
if min_kvadr = 1073676289 then sum := 0
else sum:=sum - min_kvadr
end;
writeln('sum=',sum)
end. |
Пример работы программы:
3
1 4
2 4
3 4
sum=41
✎ Задание А (более легкое, 2 балла максимум):
Комментарии
Отправить комментарий