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

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

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

Файл A

Файл B

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

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

3

1 2 3

8 12 4

6 9 7

Для ука­зан­ных дан­ных ис­ко­мая сумма равна 11, она со­от­вет­ству­ет та­ко­му рас­пре­де­ле­нию чисел по груп­пам: (2, 8, 7), (3, 12, 9), (1, 4, 6).

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

 

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

 

Ответ:

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

Ре­ше­ние.

По­сле­до­ва­тель­но счи­ты­вая дан­ные из файла, будем при­бав­лять к пер­вой сумме (пе­ре­мен­ная sumAns) ми­ни­маль­ное число в трой­ке, к тре­тьей сумме (пе­ре­мен­ная sum3) ми­ни­маль­ное число в трой­ке, а ко вто­рой сумме (пе­ре­мен­ная sum2) остав­ше­е­ся число в трой­ке. Также в пе­ре­мен­ную minDif будем за­пи­сы­вать зна­че­ние ми­ни­маль­ной нечётной раз­ни­цы между между чис­ла­ми, на­кап­ли­ва­е­мы­ми в пер­вой сумме, и одним из чисел, на­кап­ли­ва­е­мых в дру­гих сум­мах. Таким об­ра­зом, если в пе­ре­мен­ных sum2 и sum3 по окон­ча­нии ра­бо­ты про­грам­мы од­но­вре­мен­но будут два нечётных числа или два чётных числа, будем при­бав­лять к ис­ко­мой сумме зна­че­ние пе­ре­мен­ной minDif.

 

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

var

x, y, z: integer;

n: integer;

sumAns, sum2, sum3: integer;

minDif: integer;

f: text;

begin

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

reset(f);

readln(f, n);

sumAns := 0;

sum2 := 0;

sum3 := 0;

minDif := 20001;

while not eof(f) do begin

readln(f, x, y, z);

if (x <= y) and (x <= z) then begin

sumAns := sumAns + x;

if (y <= z) then begin

sum2 := sum2 + y;

sum3 := sum3 + z;

end

else begin

sum3 := sum3 + y;

sum2 := sum2 + z;

end;

if (((abs(x - y)) mod 2 <> 0) and (abs(x - y) < minDif)) then

minDif := abs(x - y)

else if (((abs(x - z)) mod 2 <> 0) and (abs(x - z) < minDif)) then

minDif := abs(x - z);

end

else if (y <= z) and (y <= x) then begin

sumAns := sumAns + y;

if (x <= z) then begin

sum2 := sum2 + x;

sum3 := sum3 + z;

end

else begin

sum3 := sum3 + x;

sum2 := sum2 + z;

end;

if (((abs(y - x)) mod 2 <> 0) and (abs(y - x) < minDif)) then

minDif := abs(y - x)

else if (((abs(y - z)) mod 2 <> 0) and (abs(y - z) < minDif)) then

minDif := abs(y - z);

end

else if (z <= x) and (z <= y) then begin

sumAns := sumAns + z;

if (x <= y) then begin

sum2 := sum2 + x;

sum3 := sum3 + y;

end

else begin

sum3 := sum3 + x;

sum2 := sum2 + y;

end;

if (((abs(z - y)) mod 2 <> 0) and (abs(z - y) < minDif)) then

minDif := abs(z - y)

else if (((abs(z - x)) mod 2 <> 0) and (abs(z - x) < minDif)) then

minDif := abs(z - x);

end;

end;

if (sum2 + sum3) mod 2 <> 0 then

writeln(sumAns)

else writeln(sumAns + minDif);

end.

 

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

 

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

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

 

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

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

s = f.readlines()

n = int(s[0])

sumAns = 0

sum2 = 0

sum3 = 0

minDif = 20001

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

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

if (x <= y) and (x <= z):

sumAns = sumAns + x

if y <= z:

sum2 = sum2 + y

sum3 = sum3 + z

else:

sum3 = sum3 + y

sum2 = sum2 + z

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

elif ((abs(x - z)) % 2 != 0) and (abs(x - z) < minDif): minDif = abs(x - z)

elif (y <= z) and (y <= x):

sumAns = sumAns + y

if x <= z:

sum2 = sum2 + x

sum3 = sum3 + z

else:

sum3 = sum3 + x

sum2 = sum2 + z

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

elif ((abs(y - z)) % 2 != 0) and (abs(y - z) < minDif): minDif = abs(y - z)

elif (z <= x) and (z <= y):

sumAns = sumAns + z

if x <= y:

sum2 = sum2 + x

sum3 = sum3 + y

else:

sum3 = sum3 + x

sum2 = sum2 + y

if ((abs(z - x)) % 2 != 0) and (abs(z - y) < minDif):

minDif = abs(z - x)

elif ((abs(z - y)) % 2 != 0) and (abs(z - x) < minDif):

minDif = abs(z - y)

if (sum2 + sum3) % 2 != 0: print(sumAns)

else: print(sumAns + minDif)

 

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

f = open('27-A.txt')

sum1, sum2, sum3, dm = 0, 0, 0, 10001

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

n1,n2,n3 = sorted(map(int, f.readline().split()))

sum1 += n1; sum2 += n2; sum3 += n3;

d = n2 - n1

if d%2 == 1 and d < dm: dm = d

d = n3 - n1

if d%2 == 1 and d < dm: dm = d

if (sum2 + sum3)%2 != 0 : print(sum1)

else: print(sum1 + dm)

 

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

f = open('27-B.txt')

n = int(f.readline())

a = []

r = []

d,k,p = 0,0,0

for i in f:

s = i.split()

s = list(map(int,s))

s.sort()

y1 = s[1] - s[0]

y2 = s[2] - s[0]

if y1 % 2 != 0:

r.append(y1)

if y2 % 2 != 0:

r.append(y2)

if r != []:

d = min(r)

a.append(d)

r =[]

k += s[1] + s[2]

p += s[0]

if k % 2 == 0:

p += min(a)

print(p)


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

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