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

Набор дан­ных со­сто­ит из нечётного ко­ли­че­ства пар на­ту­раль­ных чисел. Не­об­хо­ди­мо вы­брать из каж­дой пары ровно одно число так, чтобы чётность суммы вы­бран­ных чисел сов­па­да­ла с чётно­стью боль­шин­ства вы­бран­ных чисел и при этом сумма вы­бран­ных чисел была как можно мень­ше. Опре­де­ли­те ми­ни­маль­ную сумму, ко­то­рую можно по­лу­чить при таком вы­бо­ре. Га­ран­ти­ру­ет­ся, что удо­вле­тво­ря­ю­щий усло­ви­ям выбор воз­мо­жен.

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

Файл A

Файл B

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

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

5

15 8

5 11

6 3

7 2

9 14

Для ука­зан­ных дан­ных надо вы­брать числа 8, 5, 3, 2 и 9. Боль­шин­ство из них нечётны, сумма вы­бран­ных чисел равна 27 и тоже нечётна. В от­ве­те надо за­пи­сать число 27.

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

 

Пре­ду­пре­жде­ние: для об­ра­бот­ки файла B не сле­ду­ет ис­поль­зо­вать пе­ре­бор­ный ал­го­ритм, вы­чис­ля­ю­щий сумму для всех воз­мож­ных ва­ри­ан­тов, по­сколь­ку на­пи­сан­ная по та­ко­му ал­го­рит­му про­грам­ма будет вы­пол­нять­ся слиш­ком долго.

 

Ответ:

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

Ре­ше­ние.

По­сле­до­ва­тель­но счи­ты­вая дан­ные из файла, будем при­бав­лять к сумме зна­че­ние ми­ни­маль­но­го числа в паре, при этом, если число чётное, будем уве­ли­чи­вать зна­че­ние пе­ре­мен­ной count0 на еди­ни­цу, если нечётное  — уве­ли­чи­вать зна­че­ние пе­ре­мен­ной count1 на еди­ни­цу. По­сколь­ку может воз­ник­нуть си­ту­а­ция, когда, на­при­мер, по­лу­чив­ша­я­ся сумма будет чётной, а ко­ли­че­ство чётных чисел будет мень­ше ко­ли­че­ства нечётных чисел и будет от­ли­чать­ся от ко­ли­че­ства нечётных чисел на еди­ни­цу, будем на­хо­дить две ми­ни­маль­ных раз­ни­цы для си­ту­а­ции, когда будет уби­рать­ся два чётных числа (пе­ре­мен­ные dif3 и dif4), и две ми­ни­маль­ных раз­ни­цы для си­ту­а­ции, когда будет уби­рать­ся два нечётных числа (пе­ре­мен­ные dif1 и dif2).

 

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

var

x, y, count0, count1: longint;

n: longint;

sum: longint;

dif1, dif2, dif3, dif4: longint;

f: text;

begin

assign(f,'C:\27-B.txt');

reset(f);

readln(f, n);

sum := 0;

dif1 := 20001;

dif2 := 20001;

dif3 := 20001;

dif4 := 20001;

count0 := 0;

count1 := 0;

while not eof(f) do begin

readln(f, x, y);

if x < y then begin

sum := sum + x;

if x mod 2 = 0 then count0 := count0 + 1

else count1 := count1 + 1;

if x mod 2 <> y mod 2 then begin

if (y - x < dif1) and (y mod 2 <> 0) then begin

dif2 := dif1;

dif1 := y - x;

end

else if (y - x < dif2) and (y mod 2 <> 0) then

dif2 := y - x;

if (y - x < dif3) and (y mod 2 = 0) then begin

dif4 := dif3;

dif3 := y - x;

end

else if (y - x < dif4) and (y mod 2 = 0) then

dif4 := y - x;

end;

end

else begin

if y mod 2 = 0 then count0 := count0 + 1

else count1 := count1 + 1;

sum := sum + y;

if x mod 2 <> y mod 2 then begin

if (x - y < dif1) and (x mod 2 <> 0) then begin

dif2 := dif1;

dif1 := x - y;

end

else if (x - y < dif2) and (x mod 2 <> 0) then

dif2 := x - y;

if (x - y < dif3) and (x mod 2 = 0) then begin

dif4 := dif3;

dif3 := x - y;

end

else if (x - y < dif4) and (x mod 2 = 0) then

dif4 := x - y;

end;

end;

end;

if (count1 > count0) then begin

if sum mod 2 = 1 then

writeln(sum)

else if dif1 <= dif3 then

writeln(sum + dif1)

else if (count1 - count0) <> 1 then

writeln(sum + dif3)

else if (dif3 + dif4) < dif1 then

writeln(sum + dif3 + dif4)

else writeln(sum + dif1)

end

else begin

if sum mod 2 = 0 then

writeln(sum)

else if dif3 <= dif1 then

writeln(sum + dif3)

else if (count0 - count1) <> 1 then

writeln(sum + dif1)

else if (dif1 + dif2) < dif3 then

writeln(sum + dif1 + dif2)

else writeln(sum + dif3)

end;

end.

 

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

 

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

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

 

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

f = open("27-B (3).txt")

s = f.readlines()

n = int(s[0])

sum = 0

dif1 = 20001

dif2 = 20001

dif3 = 20001

dif4 = 20001

count0 = 0

count1 = 0

for i in range(1, n + 1):

x, y = map(int, s[i].split())

if x < y:

sum = sum + x

if x % 2 == 0: count0 = count0 + 1

else: count1 = count1 + 1

if x % 2 != y % 2:

if (y - x < dif1) and (y % 2 != 0):

dif2 = dif1

dif1 = y - x

elif (y - x < dif2) and (y % 2 != 0): dif2 = y - x

if (y - x < dif3) and (y % 2 == 0):

dif4 = dif3

dif3 = y - x

elif (y - x < dif4) and (y % 2 == 0):

dif4 = y - x

else:

if y % 2 == 0: count0 = count0 + 1

else: count1 = count1 + 1

sum = sum + y

if x % 2 != y % 2:

if (x - y < dif1) and (x % 2 != 0):

dif2 = dif1

dif1 = x - y

elif (x - y < dif2) and (x % 2 != 0):

dif2 = x - y

if (x - y < dif3) and (x % 2 == 0):

dif4 = dif3

dif3 = x - y

elif (x - y < dif4) and (x % 2 == 0):

dif4 = x - y

if count1 > count0:

if sum % 2 == 1:

print(sum)

elif dif1 <= dif3:

print(sum + dif1)

elif (count1 - count0) != 1:

print(sum + dif3)

elif (dif3 + dif4) < dif1:

print(sum + dif3 + dif4)

else: print(sum + dif1)

else:

if sum % 2 == 0:

print(sum)

elif dif3 <= dif1:

print(sum + dif3)

elif (count0 - count1) != 1:

print(sum + dif1)

elif (dif1 + dif2) < dif3:

print(sum + dif1 + dif2)

else: print(sum + dif3)


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

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