Aiuto in coda per il buffet

ciao, ho provato a risolvere coda per il buffet (coda) ma ho ottenuto solo 13 punti.
la maggior parte dei casi test sono corretti ma in alcuni casi questo codice non funziona e proprio non riesco a capire il perché.
Ecco il codice:

#include <bits/stdc++.h>
using namespace std;

vector<int> cucina(int N, int K, int X, vector<int> H) {
	vector<int> v(X,0);
	for(int i=0; i<N; i++){
		v[H[i]]++;
	}
	
	vector<vector<int> > dp(X, vector<int>(2,0)); //primo elemento serviti fino a quel punto(partendo dalla fine)
	if(v[X-1]!=0){								  //secondo elemento lunghezza coda in quel punto (sempre dalla fine,
		dp[X-1][0]=1;							  //quindi senza cosiderare gli elementi messi prima)
		dp[X-1][1]=1;
	}
	
	for(int i=X-2; i>=0; i--){
		if(v[i]==0){
			dp[i][0] = dp[i+1][0];		//se non arriva nessuno in quel secondo il numero di serviti è uguale a quello in i+1
			dp[i][1] = 0;
		}
		else{
			dp[i][1] = min(v[i], K);	//riempio la coda in i al più fino a K
			
			dp[i][0] = min(dp[i+1][0] + min(K-dp[i+1][1] +1, dp[i][1]), X-i);
			// il valore dp[i][0] non può superare X-i (il numero di secondi massimo per la fine)
			// ma è uguale a il dp successivo più il valore v[i] aggiunto (tenendo conto che può raggiungere
			// al massimo K quando sommato con il successivo dp)
			
		}
		
	}
		//cerr<<"check";
		vector<int> ans(X); // = dp[0]
		for(int i=0; i<X; i++){
			ans[i] = dp[i][0];
			//cerr<<ans[i]<<" ";
		}
		return ans;
	
	
}

int main() {
    // se preferisci leggere e scrivere da file ti basta decommentare le seguenti due righe:
    // freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);

    int N, K, X;
    cin >> N >> K >> X;

    vector<int> H(N);
    for (int& h : H) {
        cin >> h;
    }

    vector<int> res = cucina(N, K, X, move(H));
    for (int r : res) {
        cout << r << ' ';
    }
    cout << endl;

    return 0;
}

se qualche benefattore è in grado di aiutarmi lo ringrazio col cuore