Aiuto mostra di mojito

Sono abbastanza nuovo e non so ancora programmare e usare il c++ a livello decente quindi non so come si faccia a usare un metodo ricorsivo o dividi et impera, come la maggior parte delle persone che caricano il codice suggerisce di fare, quindi, visto che questo codice mi da 7/21 al massimo su terry, qualcuno ha dei suggerimenti su come migliorarlo? O su eventuali problemi? Grazie mille.

#include <iostream>
#include <vector>
#include <cstdio>

using namespace std;

const int MAXN = 1000;
const int MAXM = 1000;

int solve(int t) {
    int N, M;
    cin >> N >> M;
		
    int risposta = 0; 
    vector<unsigned long long> V(N), G(M);
	int x;
    for (int i=0; i<N; i++) {
        cin >> V[i];
    }
    for (int i=0; i<M; i++) {
        cin >> G[i];
	}
	int app, i=0, pos, posp=0, pos1=0;
	bool Found=false;
	for(int g=0;g<M;g++){
		int maxG=G[g], maxV=V[i];
		for(int n=1;n<N-i;n++){
			if(maxV<V[i+n])
				maxV=V[i+n];
		}
		for(int n=1;n<M-g;n++){
			if(maxG<G[g+n]){
				maxG=G[g+n];
				posp=g+n;
			}
		}
		for(int m=1;m<M-g;m++){
			if(G[g]<G[g+m]){
				pos=g+m;
				break;
			}
		}
		//cout<<G[pos]<<" "<<maxG<<" "<<maxV<<" "<<i<<" "<<g<<" "<<V[i]<<" "<<G[g]<<" "<<risposta<<endl;
		if(G[g]>V[i]){
			if(G[i]!=maxG || V[i]!=maxV)
				risposta=risposta+2;
			
			if(G[i]==maxG && V[i]==maxV)
				risposta=risposta+2;
		}
		else if(G[g]<=V[i]){

			if(G[g]>G[g+1] && G[g]>V[i+1] && i+1<N && g+1<M){
				risposta=risposta+3;
				i++;
				//cout<<"ci sono"<<endl; 			
			}		
			else if(G[g]<=G[g+1] && g+1<M && i+1<N){	
				if(G[g]>V[i+1] && G[pos]<V[i] && G[g+1]<V[i] && M-g<=N-i){
					risposta=risposta+3;
					i++;
					//cout<<"4"<<endl;
				}	
				else if(G[pos]>V[i] && M-pos>=N-i){
					risposta=risposta+2;
					g=pos;
					//cout<<"1"<<endl;
				}
				else if(G[pos]<V[i]){
					for(int m=1;m<M-g;m++){
						if(G[g+m]>V[i] && M-(g+m)>=N-i){
							pos1=g+m;
							Found=true;
							break;
						}
					}
					if(Found==true){
						risposta=risposta+2;
						g=pos1;
					}
					else if(maxG>V[i] && M-posp>=N-i){
						g=posp;
						risposta=risposta+2;
					}
					else /*if(G[g]>V[i+1] || G[pos]<V[i])*/{
						risposta++;
						g--;
					}
					//cout<<"5"<<endl;			
				}
				else if(maxG>V[i] && M-posp>=N-i){
					g=posp;
					risposta=risposta+2;
					//cout<<"2"<<endl;
				}
				else /*if(G[g]>V[i+1] || G[pos]<V[i])*/{
					risposta++;
					g--;
					//cout<<"3"<<endl;
				}
				//cout<<"ci sono 2"<<endl;
			}
			else{
				//cout<<"ci sono 3"<<endl;
				i--;
			}	
		}
		i++;
		app=i;
		Found=false;
		if(i>=N)
			break;
	}

	for(int i=0;i<N-app;i++){
		risposta++;
	}
	
    cout << "Case #" << t << ": " << risposta<< endl;
}

int main() {
    
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int T;
    cin >> T;

    for (int t = 1; t <=T; t++) {
    	//cout<<T<<" "<<t<<endl;
        solve(t);
    }
}

Ciao, potresti spiegare – a grandi linee – cosa fa il tuo codice?
Piccolo suggerimento: questo problema è risolvibile attraverso la programmazione dinamica. Se sei nuovo al C++, ti consiglio di usare la piattaforma AlgoBadge, che offre un percorso lineare (e se partecipi alle nazionali devi anche raggiungere il badge d’argento!).

Se sai cos’è la programmazione dinamica, ragiona sugli stati che può assumere il problema:

  • Entra un visitatore da solo

  • Entra un visitatore con la guida

  • Entra una guida da sola

Quindi puoi stabilire per ognuna il guadagno e calcolare nella tabella la soluzione ottimale.

Spero di essere stato d’aiuto, buona serata e buona fortuna!

Non so tanto della programmazione dinamica, però ci proverò. Grazie mille per il suggerimento.

Prego, se ti serve una mano a capire la programmazione dinamica in questo problema, la wiki delle Olimpiadi fornisce una soluzione molto dettagliata al problema:
https://wiki.olinfo.it/it/2020/territoriali/mostra

Se avessi bisogno di chiarimenti, chiedi pure :slight_smile: