Easy_'s blog

By Easy_, 10 years ago, In Russian

Добрый день, на acmp.ru есть такая задача: Подарки

Я пытался решить таким образом:

Если входные данные:

5 10
4 7 4 3 10

Сначало сортировал массив по неубыванию,

3 4 4 7 10

А далее делал так:

while(M > 0)
	{
		int t = A[1] - A[0];
		if(M > t)
		{
			M -= (t + 1);
			A[0] += (t + 1);
		}
		else
		{
			A[0] += M;
			M = 0;
		}
		
		i = 0;
		while(A[i] > A[i + 1] && i < N - 1)
			swap(A[i], A[i + 1]), i++;
	}

А — отсортированный массив

N — кол. элементов массива

M — кол. конфет

Надеюсь по алгоритму, идея решения ясна.. В конце работы алгоритма первый элемент массива и будет ответом.

Но такое решени не эффективное на больших входных данных и получаю TL на 10 тесте.

Теперь хочу попробовать решить через двоичные деревья, т.к. это у меня работает за O(N)

while(A[i] > A[i + 1] && i < N - 1)
			swap(A[i], A[i + 1]), i++;

А если сделать через min heap, то будет за O(log N).

У меня возникло 2 вопроса:

1) Как можно реализовать этот min heap самому, что бы там были методы добавления, и удаления корневого элемента? Если у кого есть пример, буду благодарен. В сети не нашел хороших примеров, а сам реализовал совсем не правильно.

2) Как тоже самое сделать через priority_queue? Проблема в том, что по умолчанию этот контейнер в С++ в корневом элементе хранит максимальный элемент, т.е. max heap. А мне нужно наоборот.

Я в справочнике читал, что там ему можно параметр передавать компатор(не знаю как правильно называется). В сети нашел несколько примеров, только там этот "компатор" был классом у которого много разных методов и перегруженных операторов. Тупо copy/paste не стал делать, хотел бы разобраться что и зачем.

Если кто знает, подкажите пожалуйста как сделать так, что бы в этом контейнере сортировка была по неубыванию.

Буду благодарен.

  • Vote: I like it
  • -8
  • Vote: I do not like it