Предприятие производит оптовую закупку некоторых
Входные данные.
Первая строка входного файла содержит два целых числа: N — общее количество партий изделий у поставщика и M — сумма выделенных на закупку денег (в рублях). Каждая из следующих N строк описывает одну партию и содержит два целых числа (цена одного изделия в рублях и количество изделий в партии) и один символ (латинская
В ответе запишите два целых числа: сначала количество закупленных изделий
Пример входного файла:
4 1000
30 8 A
50 12 B
40 14 A
30 60 B
В данном случае сначала нужно купить
Ответ:
Создадим два двумерных массива, для партий
Приведём решение на языке 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)

