10954. Сложить все
Стоимость сложения двух чисел
равна их сумме. То есть для того чтобы к 1 прибавить 10, следует заплатить 11.
В задаче требуется сложить все заданные числа, потратив при этом наименьшее
количество денег.
Например, складывать числа 1, 2 и
3 можно одним из трех способов:
1 + 2 = 3, стоимость 3 3 + 3 = 6, стоимость 6 Общая стоимость 9 |
1 + 3 = 4, стоимость 4 4 + 2 = 6, стоимость 6 Общая стоимость 10 |
2 + 3 = 5, стоимость 5 1 + 5 = 6, стоимость 6 Общая стоимость 11 |
Первый способ сложения самый
дешевый.
Вход. Первая
строка каждого теста содержит количество складываемых чисел n (2 £ n £ 500).
Вторая строка теста содержит n чисел,
каждое из которых не более 100000. Последняя строка содержит n = 0 и не обрабатывается.
Выход. Для каждого теста найти
наименьшую стоимость, за которую можно сложить все заданные n чисел.
3
1 2 3
4
1 2 3 4
0
Пример выхода
9
19
жадный алгоритм
Входные числа храним в
мультимножестве s (числа могут
повторяться). Два наименьшие числа всегда находятся в начале мультимножества.
multiset<int>
s;
Читаем количество чисел n. Вводим последовательность слагаемых и
заносим их в мультимножество s.
while(scanf("%d",&n),n)
{
s.clear();
for(i = 0; i
< n; i++)
scanf("%d",&num),s.insert(num);
В переменной res накапливаем стоимость сложений. Пока не осталось одно число
(размер мультимножества s больше 1),
складываем два наименьших числа и заносим их сумму в s. Стоимость сложения чисел a
и b равно a + b.
res = 0;
while(s.size()
> 1)
{
a = *s.begin(); s.erase(s.begin());
b = *s.begin(); s.erase(s.begin());
s.insert(a + b);
res += a + b;
}
Когда в мультимножестве останется
одно число, выводим ответ – значение переменной res.
printf("%d\n",res);
}