Обработка целочисленной информации. Задания для подготовки
i
Для перевозки партии грузов различной массы выделен грузовик, но его грузоподъёмность ограничена, поэтому перевезти сразу все грузы не удастся. Грузы массой от 210 до 220 кг грузят в первую очередь, гарантируется, что все такие грузы поместятся. На оставшееся после этого место стараются взять как можно больше грузов. Если это можно сделать несколькими способами, выбирают тот способ, при котором самый большой из выбранных грузов имеет наибольшую массу. Если и при этом условии возможно несколько вариантов, выбирается тот, при котором наибольшую массу имеет второй по величине груз, и так далее. Известны количество грузов, масса каждого из них и грузоподъёмность грузовика. Необходимо определить количество и общую массу грузов, которые будут вывезены при погрузке по вышеописанным правилам.
Первая строка входного файла содержит два целых числа: N — общее количество грузов и M — грузоподъёмность грузовика в кг. Каждая из следующих N строк содержит одно целое число — массу груза в кг.
В ответе запишите два целых числа: сначала максимально возможное количество грузов, затем их общую массу.
Пример входного файла:
6 615
140
215
120
160
100
340 В данном случае сначала нужно взять груз массой 215 кг. После этого можно вывезти ещё максимум 3 груза. Это можно сделать тремя способами: 140 + 120 + 100, 140 + 160 + 100, 120 + 160 + 100. Выбираем способ, при котором вывозится груз наибольшей возможной массы. Таких способов два: 140 + 160 + 100 и 120 + 160 + 100. Из этих способов выбираем тот, при котором больше масса второго по величине груза, то есть 140 + 160 + 100. Всего получается 4 груза общей массой 615 кг. В ответе надо записать числа 4 и 615.
Ответ:
Решение. Сначала считаем в массив данные из файла. После этого отсортируем массив в порядке возрастания. Таким образом, последовательно складывая элементы массива с начала и сравнивая сумму с размером грузоподъемности грузовика, получим максимальное количество грузов, которые могут поместиться в грузовике. Далее, вычитая из найденной суммы вес наибольшего груза в текущей последовательности, будем пробовать прибавлять грузы с большим весом. Далее такую же последовательность действий применим ко второму по величине грузу, потом к третьему и так далее.
Приведём решение на языке Pascal.
var
i, j, t, count: integer;
a: array [1..1000] of integer;
s: integer;
n: integer;
sum: integer;
maxi: integer;
f: text;
begin
assign(f,'C:\26.txt');
reset(f);
readln(f, n, s);
sum := 0;
count := 0;
for i := 1 to 1000 do a[i] := 0;
for i := 1 to n do begin
readln(f, t);
if ((t >= 210) and (t <= 220) and (sum + t <= s)) then begin
sum := sum + t;
count := count + 1;
end
else
a[i] := t;
end;
for i := 1 to n do
for j := i + 1 to n do
if a[i] > a[j] then begin
t := a[i];
a[i] := a[j];
a[j] := t;
end;
maxi := 1;
for i := count+1 to n do
if sum + a[i] <= s then begin
sum := sum + a[i];
count := count + 1;
maxi := i;
end;
for i := maxi downto 1 do begin
sum := sum - a[i];
t := i;
for j := i to n do
if (sum + a[j]) <= s then t := j
else break;
sum := sum + a[t];
n:=t-1;
end;
writeln(count, ' ', sum);
end.
В результате работы данного алгоритма при вводе данных из файла в условии получаем ответ — 122 10000.
Ответ: 122 10000.
Примечание. Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.
Приведём другое решение на языке Python.
f = open('26.txt')
a, b = f.readline().split()
d = []
s = 0
count = 0
for i in f:
if 210 <= int(i) <= 220:
s += int(i)
count += 1
else:
d.append(int(i))
d.sort()
d2 = []
i = 0
while sum(d2) + d[i] <= int(b) - s:
count += 1
d2.append(d[i])
i += 1
k = len(d) - 1
while i > 0:
while k >= 0:
if sum(d2) - d2[i-1] + d[k] <= int(b) - s and d[k] != 0: