Задания
Версия для печати и копирования в MS Word

В тек­сто­вом файле за­пи­сан набор пар на­ту­раль­ных чисел, не пре­вы­ша­ю­щих 10 000. Не­об­хо­ди­мо вы­брать из на­бо­ра не­ко­то­рые пары так, чтобы вто­рое число в каж­дой вы­бран­ной паре было нечётным, сумма бо́льших чисел во всех вы­бран­ных парах была чётной, а сумма мень­ших  — нечётной. Какую наи­боль­шую сумму чисел во всех вы­бран­ных парах можно при этом по­лу­чить?

Вход­ные дан­ные.

Файл A

Файл B

Пер­вая стро­ка вход­но­го файла со­дер­жит целое число N  — общее ко­ли­че­ство пар в на­бо­ре. Каж­дая из сле­ду­ю­щих N строк со­дер­жит пару чисел.

При­мер вход­но­го файла:

4

5 3

7 15

7 14

12 9 В дан­ном слу­чае есть три под­хо­дя­щие пары: (5, 3), (7, 15) и (12, 9). Пара (7, 14) не под­хо­дит, так как в ней вто­рое число чётное. Чтобы удо­вле­тво­рить тре­бо­ва­ния, надо взять пары (5, 3), (7, 15) и (12, 9). Сумма бо́льших чисел в этом слу­чае равна 32, сумма мень­ших равна 19. Общая сумма равна 51. В от­ве­те надо ука­зать число 51.

Вам даны два вход­ных файла (A и B), каж­дый из ко­то­рых имеет опи­сан­ную выше струк­ту­ру. В от­ве­те ука­жи­те два числа: сна­ча­ла зна­че­ние ис­ко­мой суммы для файла A, затем для файла B.

 

Ответ:

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние на языке Python.

f = open("inf_26_04_21_27b.txt")

n = int(f.readline())

sum0 = 0

sum1 = 0

min1 = 20001

min2 = 20001

min3 = 20001

for i in f:

x, y = i.split()

x = int(x)

y = int(y)

if y % 2 == 1:

if x > y:

sum1 = sum1 + y

sum0 = sum0 + x

if (y % 2 == 1) and (x % 2 == 1) and ((x + y) < min1):

min1 = x + y

if (y % 2 == 0) and (x % 2 == 1) and ((x + y) < min2):

min2 = x + y

if (y % 2 == 1) and (x % 2 == 0) and ((x + y) < min3):

min3 = x + y

else:

sum1 = sum1 + x

sum0 = sum0 + y

if (y % 2 == 1) and (x % 2 == 1) and ((x + y) < min1):

min1 = x + y

if (x % 2 == 0) and (y % 2 == 1) and ((x + y) < min2):

min2 = x + y

if (x % 2 == 1) and (y % 2 == 0) and ((x + y) < min3):

min3 = x + y

if (sum0 % 2 == 0) and (sum1 % 2 == 1):

print(sum0 + sum1)

elif (sum0 % 2 == 1) and (sum1 % 2 == 0):

if min1 < min2 + min3:

print(sum0 + sum1 - min1)

else:

print(sum0 + sum1 - min2 - min3)

elif (sum0 % 2 == 1) and (sum1 % 2 == 1):

if min2 < min3 + min1:

print(sum0 + sum1 - min2)

else:

print(sum0 + sum1 - min3 - min1)

elif (sum0 % 2 == 0) and (sum1 % 2 == 0):

if min3 < min2 + min1:

print(sum0 + sum1 - min3)

else:

print(sum0 + sum1 - min2 - min1)

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла A ответ  — 61771, из файла B  — 300868313.

 

При­ме­ча­ние.

Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

При­ведём ре­ше­ние Сер­гея Фе­фе­ло­ва на языке Python.

f = open('27.txt')

sum0 = sum1 = 0

m = [0] + 3*[20001]

for i in range(int(f.readline())):

x, y = map(int, f.readline().split())

if y % 2 == 0: continue

if x > y: x,y = y,x

sum0 += x

sum1 += y

j = 2*(y%2) + x%2

m[j] = min(m[j], x+y)

i = (2*(sum1%2) + sum0%2) ^ 1

print(sum0 + sum1 - min(m[i], sum(m) - m[i]))

 

При­ведём ре­ше­ние за­да­чи на языке Pascal.

Будем по­сле­до­ва­тель­но счи­ты­вать пары из файла. Для каж­дой счи­ты­ва­е­мой пары будем про­ве­рять чётность вто­ро­го числа в паре. Если вто­рое число в паре чётное  — эта пара не рас­смат­ри­ва­ет­ся. Боль­шее число в счи­тан­ной паре будем за­пи­сы­вать в пе­ре­мен­ную sum0, мень­шее число в счи­тан­ной паре будем за­пи­сы­вать в пе­ре­мен­ную sum1. Также будем на­хо­дить зна­че­ния ми­ни­маль­ных сумм для трёх слу­ча­ев:

1)  оба числа в паре нечётные  — пе­ре­мен­ная min1;

2)  боль­шее число в паре нечётное, мень­шее число в паре чётное  — пе­ре­мен­ная min2;

3)  боль­шее число в паре чётное, мень­шее число в паре нечётное  — пе­ре­мен­ная min3.

Перед тем, как вы­во­дить най­ден­ную сумму, будем де­лать про­вер­ку пе­ре­мен­ных sum0 и sum1 на чётность.

Если зна­че­ние в пе­ре­мен­ной sum0 чётно, а зна­че­ние в пе­ре­мен­ной sum1 нечётно  — вы­во­дим сумму зна­че­ний пе­ре­мен­ных sum0 и sum1 на экран.

Если зна­че­ние в пе­ре­мен­ной sum0 нечётно, а зна­че­ние в пе­ре­мен­ной sum1 чётно, тогда срав­ни­ва­ем зна­че­ния пе­ре­мен­ной min1 и суммы зна­че­ний пе­ре­мен­ных min2 + min3. На экран будем вы­во­дить сумму зна­че­ний пе­ре­мен­ных sum0 и sum1, из ко­то­рых вы­чте­но мень­шее из ранее срав­ни­ва­е­мых зна­че­ний.

Если зна­че­ние в пе­ре­мен­ной sum0 нечётно и зна­че­ние в пе­ре­мен­ной sum1 нечётно, тогда срав­ни­ва­ем зна­че­ния пе­ре­мен­ной min2 и суммы зна­че­ний пе­ре­мен­ных min1 + min3. На экран будем вы­во­дить сумму зна­че­ний пе­ре­мен­ных sum0 и sum1, из ко­то­рых вы­чте­но мень­шее из ранее срав­ни­ва­е­мых зна­че­ний.

Если зна­че­ние в пе­ре­мен­ной sum0 чётно и зна­че­ние в пе­ре­мен­ной sum1 чётно, тогда срав­ни­ва­ем зна­че­ния пе­ре­мен­ной min3 и суммы зна­че­ний пе­ре­мен­ных min1 + min2. На экран будем вы­во­дить сумму зна­че­ний пе­ре­мен­ных sum0 и sum1, из ко­то­рых вы­чте­но мень­шее из ранее срав­ни­ва­е­мых зна­че­ний.

 

При­ведём ре­ше­ние за­да­чи на языке Pascal.

var

i, n, x, y, min1, min2, min3: integer;

sum0, sum1: int64;

f: text;

begin

assign(f,'C:\inf_26_04_21_27b.txt');

reset(f);

readln(f, n);

sum0 := 0;

sum1 := 0;

min1 := 20001;

min2 := 20001;

min3 := 20001;

for i := 1 to n do begin

readln(f, x, y);

if y mod 2 = 1 then begin

if x > y then begin

sum1 := sum1 + y;

sum0 := sum0 + x;

if (y mod 2 = 1) and (x mod 2 = 1) and ((x + y) < min1) then

min1 := x + y;

if (y mod 2 = 0) and (x mod 2 = 1) and ((x + y) < min2) then

min2 := x + y;

if (y mod 2 = 1) and (x mod 2 = 0) and ((x + y) < min3) then

min3 := x + y;

end

else begin

sum1 := sum1 + x;

sum0 := sum0 + y;

if (y mod 2 = 1) and (x mod 2 = 1) and ((x + y) < min1) then

min1 := x + y;

if (x mod 2 = 0) and (y mod 2 = 1) and ((x + y) < min2) then

min2 := x + y;

if (x mod 2 = 1) and (y mod 2 = 0) and ((x + y) < min3) then

min3 := x + y;

end;

end;

end;

if (sum0 mod 2 = 0) and (sum1 mod 2 = 1) then

writeln(sum0 + sum1)

else if (sum0 mod 2 = 1) and (sum1 mod 2 = 0) then

if min1 < min2 + min3 then

writeln(sum0 + sum1 - min1)

else writeln(sum0 + sum1 - min2 - min3)

else if (sum0 mod 2 = 1) and (sum1 mod 2 = 1) then

if min2 < min3 + min1 then

writeln(sum0 + sum1 - min2)

else writeln(sum0 + sum1 - min3 - min1)

else if (sum0 mod 2 = 0) and (sum1 mod 2 = 0) then

if min3 < min2 + min1 then

writeln(sum0 + sum1 - min3)

else writeln(sum0 + sum1 - min2 - min1);

end.


Аналоги к заданию № 36001: 36882 Все

Раздел кодификатора ФИПИ: