Задача - раздать конфеты N детям. У каждого ребенка есть рейтинг. Распределение должно быть таким, чтобы каждый ребенок имел хотя бы одну конфету, а дети с более высоким рейтингом получали больше конфет, чем их соседи. Найдите минимальное количество конфет для такого распределения.
Подход:
iterate each child.
if (rating of curr child < rating of next child)
add to total and increase candy
else if (rating of curr child equal to rating of next child)
we can bring down candy for next child to 1
else if ( rating of curr child > rating of next child)
{ // if child ratings are {4 3 2 5} then
//optimal is {3 2 1 2}
//the detailed code is below
}
Подробный код:
int n = A.size();
int count = 0;
int step = 1;
int i = 0;
bool run = true;
while(run){
if(i+1 ==n){
count+=step;
run = false;
}
else if(A[i+1] > A[i]){
count+=step;
step++;
i+=1;;
}else if(A[i+1] == A[i]){
count+=step;
step = 1;
i+=1;
}else {
int j = i;
while(A[i+1] < A[i]&& (i+1)<n){
i+=1;
}
int x = i-j;
step = max(step,x+1);
count+=step;
count+=((x*(x+1))/2);
step = 2;
if(i==n-1)
run = false;
i+=1;
}
}
return count;
Код не дает ожидаемого результата. Из-за огромного размера тестового примера я не могу определить причину ошибки. Может ли кто-нибудь предоставить образец тестового примера, где он ломается?
Неудачный тестовый пример прилагается по ссылке ниже. Первое число обозначает размер массива. Тест на взлом