1071. Несоставляемое число

 

Даны n натуральных чисел. Найти минимальное натуральное число, не представимое суммой никаких из этих чисел, если в эту сумму каждое исходное число может входить не более одного раза.

 

Вход. В первой строке находится число n (1 ≤ n ≤ 10000), в следующих n строках – по одному натуральному числу в пределах от 1 до 109.

 

Выход. Вывести требуемое минимальное несоставляемое число.

 

Пример входа 1

Пример выхода 1

4

1

1

1

5

4

 

 

 

Пример входа 2

Пример выхода 2

4

1

2

4

8

16

 

 

 

РЕШЕНИЕ

последовательности

 

Анализ алгоритма

Пусть m1, m2, …, mn  – отсортированная последовательность входных чисел.

Пусть sk = . Если  sk + 1 < mk+1, то число sk + 1 не представимо в виде суммы элементов массива m. Если для всех k (0 £ k < n) выполняется неравенство sk + 1 < mk+1, то искомым числом будет sn + 1, где n – размер массива a.

 

Реализация алгоритма

Входную последовательность чисел храним в массиве m.

 

#define MAX 10000

int m[MAX];

 

Читаем входную последовательность чисел.

 

scanf("%d",&n);

for(i = 0; i < n; i++)

  scanf("%d",&m[i]);

 

Сортируем массив.

 

sort(m,m+n);

 

for(s = i = 0; i < n; i++)

{

  if (m[i] > s + 1) break;

  s += m[i];

}

 

Выводим ответ.

 

printf("%lld\n",s + 1);