Задачу "Путешествие" почему-то очень многие из вас решают очень сложно. На самом деле у этой задачи есть очень простое и короткое решение.

Давайте для начала научимся решать задачу, когда решение существует (т.е. когда ответ не -1). Представьте, что вы едете по дороге. Вы проезжаете очередную заправку. Надо ли вам тут заправляться? Ответ очевиден: если на текущем запасе бензина вы доедете до следующей заправки, то не надо, иначе надо. Этот алгоритм элементарно реализуется, для простоты даже лучше хранить не остаток бензина (он постоянно меняется), а координату, до которой мы можем доехать на текущей заправке (она меняется только при заправках), или, что эквивалентно, информацию, где мы последний раз заправлялись (координату или номер заправки).

Слегка альтернативный подход, но по сути то же самое — т.к. мы решаем задачу, а не едем по трассе, то мы всегда можем "отмотать" время назад. Поэтому едем по трассе, если видим, что до очередной заправки у нас не хватило бензина, то "отматываем" время назад и решаем, что надо бы заправиться на предыдущей заправке.

Для удобства реализации можно в конец массива заправок добавить заправку с координатой $N$ (т.е. с координатой пункта назначения). При любой разумной реализации вы никогда в ней заправляться не будете, зато в основном цикле вам не придется особо рассматривать последний отрезок пути.

Осталось научиться определять, когда ответ -1. Вообще, несложно понять, что ответ -1 тогда и только тогда, когда есть две заправки подряд, расстояние между которыми больше $k$. Это можно проверить заранее, или можно по ходу основного цикла, когда мы решаем заправиться, сразу проверять, сможем ли мы доехать хотя бы до следующей заправки.

Вот два примера решений, которые реализуют этот простой алгоритм:

// Автор — Саддамбек Нурланбек уулу, комментарии мои (П.К.)
#include 
 
using namespace std;
 
int k, q, c, n, a[1111];
 
int main(){
      cin >> n >> k >> s;
 
      // ввод данных
      for(int i = 1;i <= s;++i){
            cin >> a[i];
            // сразу проверяем, есть ли решение 
            if(a[i] -  a[i - 1] > k){
                  cout << -1;
                  return 0;
            }
      }

      // l - номер заправки, где заправлялись последний раз
      // (всё решение, и выше тоже, предполагает, что в a[0] == 0 изначально, 
      // это на самом деле не очень хорошо)
      int l = 0;
 
      // добавляем заправку в пункте назначения
      a[++s] = n;
 
      for(int i = 1;i <= s;++i){
            // если до текущей заправки доехать не можем
            if(a[i] - a[l] > k){
                  c++;
                  // заправляемся в предыдущем пункте
                  l = i - 1;
            }
      }
 
      cout << c;
}

# Автор — Андрей Ефремов, комментарии мои (П.К.)
n, k = [int(i) for i in input().split()]
s = [int(i) for i in input().split()]

# добавили заправку "очень далеко"
s.append(2000)

ans = 0

# now = до какой координаты можем доехать при текущем запасе бензина
now = k

i = 1
# пока не можем доехать до финиша
while now < n:
    # если не можем доехать до следующей заправки
    if s[i + 1] > now:
        # если и до текущей не можем, то решения нет
        if s[i] > now:
            print(-1)
            break
        else:
            # иначе надо заправиться на текущей заправке
            ans += 1
            now = s[i] + k
    i += 1
# else после while в питоне работает только если из while мы вышли не по break
else:
    print(ans)