Даны N целых чисел. Каждое из этих чисел можно увеличить или уменьшить один раз не более чем на заданное натуральное число L. Если после каждой операции какие-либо числа становятся равными, мы считаем их одним числом. Задача состоит в том, чтобы вычислить мощность минимального набора различных целых чисел.
Ограничения: N ‹= 100, L ‹= 3200, целые числа находятся в диапазоне [-32000, 32000]
Пример: N = 3, L = 10 11 21 27
1) увеличить 11 на 10 => 21 21 27
2) уменьшить 27 на 6 => 21 21 21
Ответ 1.
Алго на языке C++:
sort(v.begin(), v.end());
// the algo tries to include elements in interval of length 2 * L
int ans = 0;
int first = 0;
for(int i = 1; i < N; ++i) {
if(v[i] - v[first] > 2 * L) { // if we can't include i-th element
ans++; // into the current interval
first = i; // the algo construct new
}
}
ans++;
printf("%d", ans);
Я пытаюсь понять, почему этот жадный алгоритм оптимален. Любая помощь приветствуется.