Monete a posto(monete) output errato

Ho scritto questo codice per risolvere monete a posto(monete) e l’idea è quella di spostare dal nodo figlio a quello di sopra le monete necessarie a portare il figlio ad 1(aggiungendo o togliendo da sopra), gli esempi li fa bene ma sul sito mi da output errato per tutti i case e non capisco perché. Qualcuno ha un esempio di input su cui il mio codice sbaglia?

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int N;
    cin>>N;
    vector<int> V(N);
    for(int i = 0; i<N; i++){
        cin>>V[i];
    }
    vector<int> F(N-1);
    for(int i = 0; i<N-1; i++){
        cin>>F[i];
    }
    int ans=0;
    for(int i=N-2; i>=0; i--){
        if(V[i+1]>1){
            V[F[i]-1]+=V[i+1]-1;
            ans+=V[i+1]-1;
            V[i+1]=1;
        }
        else{
            if(V[i+1]<1){
                V[F[i]-1]-=1-V[i+1];
                ans+=1-V[i+1];
                V[i+1]=1;
            }
        }/*
        cout<<endl;
        for(int i = 0; i<N; i++){
            cout<<V[i];
        }
        cout<<endl;
        for(int i = 0; i<N-1; i++){
            cout<<F[i];
        }
        cout<<endl;*/
    }
    cout<<ans;

    return 0;
}

Prova con questo input:
5
5 0 0 0 0
4 4 1 1

1 Mi Piace

Ho sistemato il codice per risolvere questo errore ripetendo tutto in un do while finche le monete non sono tutte ad 1, però il sito mi da ancora output errato per tutti e non capisco perché.

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int N;
    cin>>N;
    vector<int> V(N);
    for(int i = 0; i<N; i++){
        cin>>V[i];
    }
    vector<int> F(N-1);
    for(int i = 0; i<N-1; i++){
        cin>>F[i];
    }
    int ans=0;	
    int T=0;
	do{
		T=0;
		for(int i=N-2; i>=0; i--){
        	if(V[i+1]>1){
        	    V[F[i]-1]+=V[i+1]-1;
        	    ans+=V[i+1]-1;
       	    	V[i+1]=1;
        	}
        	else{
            	if(V[i+1]<1){
                	V[F[i]-1]=V[F[i]-1]-(1-V[i+1]);
                	ans+=1-V[i+1];
                	V[i+1]=1;
            	}
        	}
        }
        for(int i = 1; i<N; i++){
        	if(V[i]!=1){
        		T=1;
        		break;
			}
		}
	}
	while(T==1);
    cout<<ans;

    return 0;
}

Se aggiungi la lettura e scrittura da file il codice fa 100

1 Mi Piace