MEX#5880

MEX (Розбір)

Припустимо, що — цілочисловий масив довжини 10^5. Для кожного значення з вхідного списку репресованих встановимо cnt[x] = 1.

Потім потрібно знайти найменший індекс , для якого cnt[i] = 0. Це число і є мінімальним з тих, які відсутні у вхідних даних. Саме буде номером найталановитішого з залишених живими військових.

Приклад

Розглянемо стан масиву після обробки всіх даних вхідного тесту.

Найменшим числом, відсутнім у вхідному масиві, буде , оскільки cnt[5] = 0.

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

Оголосимо масив для підрахунку номерів, які зустрічаються у вхідних даних.

#define MAX 100001
int cnt[MAX];

Читаємо вхідні дані. Для кожного значення з списку репресованих встановлюємо cnt[x] = 1.

scanf("%d", &n);
for (i = 0; i < n; i++)
{
  scanf("%d", &x);
  cnt[x] = 1;
}

Далі шукаємо найменше невід'ємне ціле число, відсутнє у вхідному списку. Для цього потрібно знайти мінімальне i~(i \ge 0), для якого cnt[i] = 0.

for (i = 0; i < MAX; i++)
  if (cnt[i] == 0)
  {
    printf("%d\n", i);
    break;
  }

Реалізація алгоритму – bitset

Оголошуємо константу і бітовий масив .

#define MAX 100001
bitset<MAX> m;

Читаємо вхідні дані. Для кожного значення з списку репресованих встановлюємо m[x] = true.

scanf("%d", &n);
for (i = 0; i < n; i++)
{
  scanf("%d", &x);
  m[x] = true;
}

Далі шукаємо найменше невід'ємне ціле число, відсутнє у вхідному списку. Для цього потрібно знайти мінімальне i~(i \ge 0), для якого m[i] = 0.

for (i = 0; i < MAX; i++)
  if (!m[i])
  {
    printf("%d\n", i);
    return 0;
  }