1) 5
2) 9
3) 9
4) 10
алгоритм простой, представим число n-1 (т.к. ноль не учитывается) в качестве двойчной последовательности, для числа n=32 это будет 11111 дальнейший алгоритм прост, рассмотрим его на примере, задумано число 26:
1) проверяем правый регист (*0000 = 16), задаем вопрос "задуманое число больше 16?", ответ "да", значит первы регистр 1
2) проверяем следующий (1*000=24), задаем вопрос "задуманое число больше 24?", ответ "да", значит регистр 1
3) проверяем следующий (11*00=28), задаем вопрос "задуманое число больше 28?", ответ "нет", значит регистр 0
4)проверяем следующий (110*0=26), задаем вопрос "задуманое число больше 26?", ответ "нет", значит регистр 0
5) проверяем следующий (1100*=25), задаем вопрос "задуманое число больше 25?", ответ "да", значит регистр 1
итого получаем задуманное число в двоичной форме 11001 = 25, но т.к. мы не учитываем 0, то к этому числу надо прибавить 1, итого задусманное число 26
#include <iostream>
#include <set>
typedef long long ll;
int main()
{
std::multiset<ll> st;
{
int n;
ll population;
std::cin >> n;
for(int i = 0; i < n; ++i)
{
std::cin >> population;
st.insert(population);
}
}
ll result = 0;
while(st.size() > 1)
{
ll a = *st.begin();
ll b = *(++st.begin());
st.erase(st.begin());
st.erase(st.begin());
a += b;
result += a;
st.insert(a);
}
std::cout << result;
return 0;
}
Объяснение:
Решил не я!