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

Пред­при­я­тие про­из­во­дит опто­вую за­куп­ку не­ко­то­рых из­де­лий A и B, на ко­то­рую вы­де­ле­на опре­делённая сумма денег. У по­став­щи­ка есть в на­ли­чии пар­тии этих из­де­лий раз­лич­ных мо­ди­фи­ка­ций по раз­лич­ной цене. На вы­де­лен­ные день­ги не­об­хо­ди­мо при­об­ре­сти как можно боль­ше из­де­лий A не­за­ви­си­мо от мо­ди­фи­ка­ции. Если у по­став­щи­ка за­кон­чат­ся из­де­лия A, то на остав­ши­е­ся день­ги не­об­хо­ди­мо при­об­ре­сти как можно боль­ше из­де­лий B. Из­вест­ны вы­де­лен­ная для за­куп­ки сумма, а также ко­ли­че­ство и цена раз­лич­ных мо­ди­фи­ка­ций дан­ных из­де­лий у по­став­щи­ка. Не­об­хо­ди­мо опре­де­лить, сколь­ко будет за­куп­ле­но из­де­лий B и какая сумма оста­нет­ся не­ис­поль­зо­ван­ной.

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

За­да­ние 26

Пер­вая стро­ка вход­но­го файла со­дер­жит два целых числа: N  — общее ко­ли­че­ство пар­тий из­де­лий у по­став­щи­ка и M  — сумма вы­де­лен­ных на за­куп­ку денег (в руб­лях). Каж­дая из сле­ду­ю­щих N строк опи­сы­ва­ет одну пар­тию и со­дер­жит два целых числа (цена од­но­го из­де­лия в руб­лях и ко­ли­че­ство из­де­лий в пар­тии) и один сим­вол (ла­тин­ская буква A или B), опре­де­ля­ю­щий тип из­де­лия. Все дан­ные в стро­ках вход­но­го файла от­де­ле­ны одним про­бе­лом.

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

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

4 1000

30 8 A

50 12 B

40 14 A

30 60 B

В дан­ном слу­чае сна­ча­ла нужно ку­пить из­де­лия A: 8 из­де­лий по 30 руб­лей и 14 из­де­лий по 40 руб­лей. На это будет по­тра­че­но 800 руб­лей. На остав­ши­е­ся 200 руб­лей можно ку­пить 6 из­де­лий B по 30 руб­лей. Таким об­ра­зом, всего будет куп­ле­но 6 из­де­лий B и оста­нет­ся 20 руб­лей. В от­ве­те надо за­пи­сать числа 6 и 20.

 

Ответ:

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

Ре­ше­ние.

Со­зда­дим два дву­мер­ных мас­си­ва, для пар­тий из­де­лий A и для пар­тий из­де­лий B. Счи­та­ем дан­ные из файла в эти мас­си­вы, в первую стро­ку мас­си­ва будем счи­ты­вать цену из­де­лия в пар­тии, во вто­рую стро­ку будем счи­ты­вать ко­ли­че­ство из­де­лий в пар­тии. Далее от­сор­ти­ру­ем эти мас­си­вы по воз­рас­та­нию. Сна­ча­ла найдём, сколь­ко из­де­лий A можно за­ку­пить на вы­де­лен­ную сумму, по­сле­до­ва­тель­но при­бав­ляя к пе­ре­мен­ной sum цену из­де­лия в те­ку­щей пар­тии. После найдём, сколь­ко из­де­лий B можно за­ку­пить на вы­де­лен­ную сумму, по­сле­до­ва­тель­но при­бав­ляя к пе­ре­мен­ной sum цену из­де­лия в те­ку­щей пар­тии, также будем на­кап­ли­вать в пе­ре­мен­ной countSumB ко­ли­че­ство куп­лен­ных из­де­лий.

 

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

var

n, m, x, y, t1, t2, countA, countB, i, j: integer;

z: string;

arrayA: array [1..500,1..2] of integer;

arrayB: array [1..500,1..2] of integer;

sum, countSumB: integer;

f: text;

begin

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

reset(f);

readln(f, n, m);

countA := 0;

countB := 0;

sum := 0;

for i := 1 to m do begin

if not eof(f) then

readln(f, x, y, z)

else break;

if z.Contains('A') then begin

arrayA[i,1] := x;

arrayA[i,2] := y;

countA := countA + 1;

end;

if z.Contains('B') then begin

arrayB[i,1] := x;

arrayB[i,2] := y;

countB := countB + 1;

end;

end;

for i := 1 to n do

for j := i + 1 to n do

if arrayA[i,1] > arrayA[j,1] then begin

t1 := arrayA[i,1];

t2 := arrayA[i,2];

arrayA[i,1] := arrayA[j,1];

arrayA[i,2] := arrayA[j,2];

arrayA[j,1] := t1;

arrayA[j,2] := t2;

end;

for i := 1 to n do

for j := i + 1 to n do

if arrayB[i,1] > arrayB[j,1] then begin

t1 := arrayB[i,1];

t2 := arrayB[i,2];

arrayB[i,1] := arrayB[j,1];

arrayB[i,2] := arrayB[j,2];

arrayB[j,1] := t1;

arrayB[j,2] := t2;

end;

for i := n-countA+1 to n do

for j := 1 to arrayA[i,2] do

if (sum + arrayA[i,1]) < m then

sum := sum + arrayA[i,1]

else break;

for i := n-countB+1 to n do

for j := 1 to arrayB[i,2] do

if (sum + arrayB[i,1]) < m then begin

sum := sum + arrayB[i,1];

countSumB := countSumB + 1;

end

else break;

writeln(countSumB, ' ', m - sum);

end.

 

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

 

Ответ: 5895 227.

 

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

 

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

f = open('26.txt')

x, y = f.readline().split()

y = int(y)

for_B_price = []

for_B_kol = []

for i in f:

if 'A' in i:

a, b, c = i.split()

y -= int(a) * int(b)

else:

a2, b2, c2 = i.split()

for_B_price.append(int(a2))

for_B_kol.append(int(b2))

mini = min(for_B_price)

index_mini = 0

for i in range(len(for_B_price)):

if mini == for_B_price[i]:

index_mini = i

kol_B = 0

while y > for_B_price[index_mini]:

y -= for_B_price[index_mini]

for_B_kol[index_mini] -= 1

kol_B += 1

if for_B_kol[index_mini] == 0:

for_B_price[index_mini] = 1000000000

mini = min(for_B_price)

for i in range(len(for_B_price)):

if mini == for_B_price[i]:

index_mini = i

print(kol_B, y)

 

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

f = open("26.txt")

n , m = f.readline().split()

n = int(n);m = int(m)

v = []

for i in range(n):

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

v.append((c,int(a),int(b)))

v.sort(key = lambda x: (x[0],x[1]))

be = 0

for i in v:

if m - i[1] < 0:

break

for z in range(i[2]):

if m - i[1] >= 0:

m = m - i[1]

if i[0] == 'B':

be +=1

print(be,m)


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

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