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

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

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

Файл A

Файл B

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

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

4

5 2

8 15

7 14

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

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

 

Ответ:

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

Ре­ше­ние.

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

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 x mod 2 = 1 then begin

if x > y then begin

sum1 := sum1 + x;

sum0 := sum0 + y;

if (x mod 2 = 1) and (y 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

else begin

sum1 := sum1 + y;

sum0 := sum0 + x;

if (x mod 2 = 1) and (y 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;

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.

 

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

 

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

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

 

При­ведём ре­ше­ние на языке 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 x % 2 == 1:

if x > y:

sum1 = sum1 + x

sum0 = sum0 + y

if (x % 2 == 1) and (y % 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

else:

sum1 = sum1 + y

sum0 = sum0 + x

if (x % 2 == 1) and (y % 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

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)

 

При­ведём ре­ше­ние Мат­вея Кур­чен­ко на языке Python.

f = open('inf_26_04_21_27b.txt')

n = int(f.readline())

s1 = s2 = 0

mn1 = mn2 = mn3 = mn4 = 1e9

for i in range(n):

a, b = map(int, f.readline().split())

if a%2 == 1:

s1 += max(a, b)

s2 += min(a, b)

r = max(a, b)

h = min(a, b)

if r%2 == 0 and h%2 == 1:

mn1 = min(mn1, r+h)

if r%2 == 1 and h%2 == 1:

mn2 = min(mn2, r+h)

if r%2 == 1 and h%2 == 0:

mn3 = min(mn3, r+h)

if s1%2 == 1 and s2%2 == 0:

print(s1 + s2)

if s1%2 == 0 and s2%2 == 0:

print(s1 + s2 - min(mn3, mn1 + mn2))

if s1%2 == 0 and s2%2 == 1:

print(s1 + s2 - mn2)

if s1%2 == 1 and s2%2 == 1:

print(s1 + s2 - min(mn1, mn2+mn3))

 

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

f = open('inf_26_04_21_27b.txt')

n = int(f.readline())

a = []

for i in f:

s = i.split()

s = list(map(int,s))

if s[0] % 2 == 1:

m2 = max(s[0],s[1])

m1 = min(s[0],s[1])

a.append([m1+m2,m2,m1])

a.sort()

g,z1,z2 = 0,0,0

g = sum(i[0] for i in a)

z1 = sum(i[2] for i in a)

z2 = sum(i[1] for i in a)

if (z2 % 2 == 1) and (z1 % 2 == 0):

print(g)

else:

for i in a:

if ((z2 - i[1]) % 2 == 1) and ((z1 - i[2]) % 2 == 0):

mm = g - i[1] - i[2]

x = a.index(i)

break

for k1 in range(0,x-1):

for k2 in range(k1+1,x):

if ((z2 - a[k1][1] - a[k2][1]) % 2 == 1) and ((z1 - a[k1][2] - a[k2][2]) % 2 == 0):

mm1 = g - a[k1][1] - a[k2][1] - a[k1][2] - a[k2][2]

mm = max(mm,mm1)

print(mm)

 


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

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