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

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

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

Файл A

Файл B

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

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

3

1 2 3

5 12 4

6 9 7

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

Вам даны два вход­ных файла (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 - x)) mod 2 <> 0) and (abs(z - x) < minDif)) then

minDif := abs(z - x)

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

minDif := abs(z - y);

end;

end;

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

writeln(sumAns)

else writeln(sumAns - minDif);

end.

 

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

 

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

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

 

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

f = open("27-B.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 - x) < minDif):

minDif = abs(z - x)

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

minDif = abs(z - y)

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

else: print(sumAns - minDif)

 

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

f = open('27.txt')

n = int(f.readline())

sum_a = sum_b = sum_max = 0

min_razn = 100000000

for i in range(n):

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

sum_max += max(a, b, c)

sum_a += min(a, b, c)

average = a + b + c - max(a, b, c) - min(a, b, c)

sum_b += average

if max(a, b, c) - average < min_razn and max(a, b, c) - average != 0 and max(a, b, c) - average % 2 != 0 and max(a, b, c) - min(a,b,c) % 2 != 0:

min_razn = max(a, b, c) - average

if (sum_b % 2) == (sum_a % 2): print(sum_max - min_razn)

else: print(sum_max)

 

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

f = open('27.txt')

n = int(f.readline())

a = []

d,k,p = 0,0,0

for i in f:

s = i.split()

s = list(map(int,s))

s.sort(reverse=True)

d = min((s[0] - s[1]),(s[0] - s[2]))

a.append(d)

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

p += s[0]

a.sort()

g = 0

while k % 2 == 0:

if (k + a[g]) % 2 == 1:

p -= a[g]

break

else:

g += 1

print(p)

 

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

n = [sorted(list(map(int, a.split(' ')))) for a in open('27.txt').readlines()[1:]] # мас­сив от­сор­ти­ро­ван­ных чисел в трой­ках

sum_min = sum([a[0] for a in n])

sum_aver = sum([a[1] for a in n])

sum_max = sum([a[2] for a in n])

if sum_min%2 == sum_aver%2:

sum_max += max([a[1] - a[2] for a in n if a[1]%2 != a[2]%2] + [a[0] - a[2] for a in n if a[1]%2 != a[2]%2]) # мак­си­маль­ная вы­го­да, ко­то­рую можно по­лу­чить после пе­ре­ста­нов­ки чисел

print(sum_max)


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

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