Varsayalım ki, — uzunluğu 10^5 olan bir tam sayı massividir. Hər bir repressiya olunmuş siyahıda olan qiyməti üçün cnt[x] = 1 olaraq təyin edəcəyik.
Sonra, cnt[i] = 0 olan ən kiçik indeksi tapmalıyıq. Giriş məlumatlarında olmayan ən kiçik sayı məhz budur. Məhz sağ qalmış hərbçilərin arasında ən istedadlı olanın nömrəsi olacaq.
Nümunə
Giriş testindəki bütün məlumatlar işlənildikdən sonra massivinin vəziyyətini nəzərdən keçirək.
Giriş massivində olmayan ən kiçik sayı olacaq, çünki cnt[5] = 0.
Alqoritmin reallaşdırılması
Giriş məlumatlarında olan nömrələrə sayma üçün massiv elan edəcəyik.
#define MAX 100001
int cnt[MAX];Giriş məlumatlarını oxuyuruq. Repressiya olunmuş siyahıdaki hər bir qiyməti üçün cnt[x] = 1 təyin edirik.
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &x);
cnt[x] = 1;
}Sonra giriş siyahısında olmayan ən kiçik qeyri-mənfi tam ədədi axtarırıq. Bunun üçün cnt[i] = 0 olan ən kiçik i~(i \ge 0) tapılmalıdır.
for (i = 0; i < MAX; i++)
if (cnt[i] == 0)
{
printf("%d\n", i);
break;
}Alqoritmin reallaşdırılması – bitset
Konstant və bit massiv elan edəcəyik.
#define MAX 100001
bitset<MAX> m;Giriş məlumatlarını oxuyuruq. Repressiya olunmuş siyahıdaki hər bir qiyməti üçün m[x] = true təyin edirik.
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &x);
m[x] = true;
}Sonra giriş siyahısında olmayan ən kiçik qeyri-mənfi tam ədədi axtarırıq. Bunun üçün m[i] = 0 olan ən kiçik i~(i \ge 0) tapılmalıdır.
for (i = 0; i < MAX; i++)
if (!m[i])
{
printf("%d\n", i);
return 0;
}