Найти в Дзене
_defaultIT

Всем известно, что лучшие в мире яхты строит знаменитая Екатеринозаводская верфь. Задача для Pascal.

ПАСКАЛЬ Задача по информатике

Нужно написать программу в паскале, которая решит следующую задачу: Всем известно, что лучшие в мире яхты строит знаменитая Екатеринозаводская верфь. Они на- столько популярны, что как только богатый промышленник становится миллиардером, он в конце того же месяца приходит на верфь за яхтой. Ещё бы! На Екатеринозаводской верфи яхты изготав- ливаются вручную, в оформлении интерьера используются ценные породы красно-чёрного дерева... К сожалению, на верфи совсем немного рабочих, поэтому за месяц она может построить не более d новых яхт. В результате, верфь не всегда успевает справиться с наплывом покупателей. А милли- ардеры — люди гордые: если они придут на верфь, а готовой яхты там не будет, то они обидятся и раздумают совершать покупку. Конечно, верфь может производить яхты впрок, но хранение гото- вых яхт недёшево — один месяц хранения одной яхты обходится верфи в 1 золотой слиток. Руководство решило узнать, какое максимальное количество яхт сможет продать верфь в бли- жайшие n месяцев и какое минимальное количество золота для этого придётся потратить на хра- нение готовых яхт. С этой целью руководство обратилось к студентам экономического факультета Екатеринозаводского университета, и те, исследовав динамику роста цен на полезные ископаемые, посчитали, сколько людей станет миллиардерами в каждый из n ближайших месяцев. Ваша же цель — ответить на вопросы руководства, используя эту информацию.

Формат входных данных :
В первой строке через пробел записаны целые числа n и d
Во второй строке через пробел записаны целые числа a1, a2, . . . , an.
Число ai обозначает коли- чество людей, которые станут миллиардерами в i-й месяц.

Формат выходных данных:
Выведите через пробел два числа — максимальное количество яхт, которое сможет продать верфь, и минимальное количество золотых слитков, которое для этого придётся потратить на хра- нение готовых яхт.

Решение:

program YachtSales;

var
n, d, i, sold, stored, max_sold: integer;
a: array of integer;

begin
readln(n, d);
SetLength(a, n);
for i := 0 to n-1 do
read(a[i]);

sold := 0;
stored := 0;
max_sold := 0;
for i := 0 to n-1 do
begin
sold := Min(a[i], d);
stored := stored + Max(0, d-a[i]);
max_sold := max_sold + sold;
end;

writeln(max_sold, ' ', stored);
end.

Программа считывает входные значения и сохраняет их в переменных n, d и a. Затем она перебирает n месяцев и для каждого месяца вычисляет количество яхт, которые можно продать (минимум между числом миллиардеров и d), количество яхт, которые нужно хранить (максимум между 0 и d-a[i], т.е. количество яхт, которые были произведены, но не проданы), и общее количество яхт, которое можно продать за n месяцев (сумма переменных sold). Наконец, выводится общее количество проданных яхт и количество золотых слитков, потраченных на хранение.

Предполагается, что верфь может производить d яхт в месяц, и что она не может переносить производство из одного месяца в другой. Если верфь может производить больше или меньше d яхт в месяц, или если она может переносить производство, реализация должна быть изменена соответствующим образом.

Если ошибки и ругается на Min и Max, то, похоже, что встроенные в Паскаль функции Min и Max доступны не во всех компиляторах.

Вот альтернативная реализация, которая не использует Min и Max:

program YachtSales;

var
n, d, i, sold, stored, max_sold: integer;
a: array of integer;

function min(a, b: integer): integer;
begin
if a < b then
min := a
else
min := b;
end;

function max(a, b: integer): integer;
begin
if a > b then
max := a
else
max := b;
end;

begin
readln(n, d);
SetLength(a, n);
for i := 0 to n-1 do
read(a[i]);

sold := 0;
stored := 0;
max_sold := 0;
for i := 0 to n-1 do
begin
sold := min(a[i], d);
stored := stored + max(d-a[i], 0);
max_sold := max_sold + sold;
end;

writeln(max_sold, ' ', stored);
end.
-2