Задания
Версия для печати и копирования в MS Word
Тип 26 № 29674
i

Про­да­вец предо­став­ля­ет по­ку­па­те­лю, де­ла­ю­ще­му боль­шую за­куп­ку, скид­ку по сле­ду­ю­щим пра­ви­лам:

—  на каж­дый вто­рой товар сто­и­мо­стью боль­ше 50 руб­лей предо­став­ля­ет­ся скид­ка 25%;

—  общая сто­и­мость по­куп­ки со скид­кой округ­ля­ет­ся вверх до це­ло­го числа руб­лей;

—  по­ря­док то­ва­ров в спис­ке опре­де­ля­ет про­да­вец и де­ла­ет это так, чтобы общая сумма скид­ки была наи­мень­шей.

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

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

За­да­ние 26

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

В от­ве­те за­пи­ши­те два целых числа: сна­ча­ла общую сто­и­мость по­куп­ки с учётом скид­ки, затем сто­и­мость са­мо­го до­ро­го­го то­ва­ра, на ко­то­рый будет предо­став­ле­на скид­ка.

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

6

125

50

490

215

144

320 В дан­ном слу­чае товар сто­и­мо­стью 50 не участ­ву­ет в опре­де­ле­нии скид­ки, осталь­ные то­ва­ры про­дав­цу вы­год­но рас­по­ло­жить в таком по­ряд­ке цен: 490, 125, 215, 144, 320. Тогда скид­ка предо­став­ля­ет­ся на то­ва­ры сто­и­мо­стью 125 и 144. Сто­и­мость этих двух то­ва­ров со скид­кой со­ста­вит 201,75 руб­лей, после округ­ле­ния  — 202 рубля. Общая сто­и­мость по­куп­ки со­ста­вит:

50 + 490 + 215 + 320 + 202  =  1277 руб­лей.

Самый до­ро­гой товар, на ко­то­рый будет по­лу­че­на скид­ка, стоит 144 рубля. В от­ве­те нужно за­пи­сать числа 1277 и 144.

 

Ответ:

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

Ре­ше­ние.

За­ме­тим, что числа, мень­шие 51, можно сразу сум­ми­ро­вать, по­сколь­ку на них скид­ка не рас­про­стра­ня­ет­ся. По­это­му, по­строч­но счи­ты­вая числа из файла, числа, мень­шие 51, будем сразу на­кап­ли­вать в пе­ре­мен­ной sum, а осталь­ные числа будем за­пи­сы­вать в мас­сив. Далее, от­сор­ти­ро­вав мас­сив по воз­рас­та­нию, будем при­бав­лять к пе­ре­мен­ной sum сто­и­мость то­ва­ра с учётом скид­ки, если дан­ный эле­мент мас­си­ва имеет ин­декс, мень­ший, чем ко­ли­че­ство чисел, поделённое по­по­лам, и без учёта скид­ки в осталь­ных слу­ча­ях.

 

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

var

cntArray, n: integer;

a: array[1..1000] of real;

num: real;

sum: real;

maxPrice: integer;

f: text;

begin

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

reset(f);

sum := 0;

cntArray := 1;

readln(f, n);

while not Eof(f) do begin

readln(f, num);

if num < 51 then

sum := sum + num

else begin

a[cntArray] := num;

cntArray := cntArray + 1;

end;

end;

cntArray := cntArray - 1;

for i:integer := 1 to cntArray - 1 do

for j:integer := 1 to cntArray - 1 do begin

if a[j] > a[j+1] then begin

num := a[j];

a[j] := a[j+1];

a[j+1] := num;

end;

end;

for i:integer := 1 to cntArray do

if i <= cntArray div 2 then begin

sum := sum + a[i]*0.75;

maxPrice := round(a[i])

end

else

sum := sum + a[i];

writeln(round(sum+0.5), ' ', maxPrice);

end.

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла в усло­вии по­лу­ча­ем ответ  — 469784 511.

 

Ответ: 469784 511.

 

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

 

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

import math

f = open('inf_22_10_20_26.txt')

a = []

m = int(f.readline()) # Уда­ля­ем первую стро­ку(общее ко­ли­че­ство куп­лен­ных то­ва­ров)

s = 0

maxi = 0

for i in f:

x = int(i)

if x <= 50:

s += x

else:

a.append(x)

a.sort()

for i in range(len(a)):

if i < len(a)//2:

s += a[i] * 0.75

maxi = a[i]

else:

s += a[i]

print(math.ceil(s), maxi)

 

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

f = open('26.txt')

n = f.readline() # ко­ли­че­ство то­ва­ров

a = [int(i) for i in f]

a.sort()

men50 = []

while a[0] <= 50:

men50.append(a[0])

del a[0]

ksum = sum(men50)

for i in range(len(a) // 2):

ksum += a[i] * 0.75

ksum += a[-i - 1]

if len(a)%2==1:

ksum+=a[len(a)//2]

print(int(ksum) + 1, a[len(a) // 2 - 1])

 

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

a = [int(b) for b in open("inf_22_10_20_26.txt")][1:]

sm = 0

k = []

for b in a:

if b > 50:

k.append(b)

else:

sm += b

k.sort()

c = len(k) // 2

print(sm + sum(k[c:]) + round(sum(k[:c]) * 0.75), k[:c][-1])

 

 

 

При­ведём ре­ше­ние Ар­ту­ра Ва­ле­е­ва на языке Python.

a = [int(s) for s in open('inf_22_10_20_26.txt')][1:]

b50 = sorted([x for x in a if x > 50])

skidka = sum(b50[:len(b50)//2])//4

print(sum(a) - skidka,b50[len(b50)//2 - 1])


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

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