Dessert 40/100 help

Ciao a tutti, sono nuovo sul forum. Ho partecipato alla gara OIS dell’altro giorno.
Stavo provando a risolvere dessert ma sono riuscito solo a ottenere 40 punti su 100. Qualcuno mi darebbe una mano? Questo è il codice.

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

int main()
{
	int N;
	cin>>N;
	vector<vector<int>> friends;
	friends.resize(N);
	vector<int> least;
	least.resize(N);
	for(int i=0;i<N;i++){
		int M;
		cin>>M;
		friends.at(i).resize(M);
		int L;
		cin>>L;
		least.at(i)=L;
		for(int j=0;j<M;j++){
			int F;
			cin>>F;
			friends.at(i).at(j)=F;
		}
	}
	vector<bool> order;
	order.resize(N,false);
	while(true){
		int succ=-1;
		for(int i=0;i<N;i++){
			if(!order.at(i)){
				int friendsOK=0;
				for(int j=0;j<friends.at(i).size();j++){
					if(order.at(friends.at(i).at(j))){
						friendsOK++;
					}
				}
				if(friendsOK>=least.at(i)){
					succ=i;
					break;
				}
			}
		}
		if(succ==-1){
			break;
		}
		order.at(succ)=true;
	}
	int res=0;
	for(int i=0;i<N;i++){
		if(order.at(i)){
			res++;
		}
	}
	cout<<res<<endl;
	return 0;
}

Grz :smile:

La tua soluzione e’ quadratica, quindi immagino ti vada fuori tempo, prova a trovare una soluzione lineare.
hint: prova a modellare il problema come grafo

Grazie per la risposta. Avevo capito che la mia soluzione era troppo lenta ma non so come velocizzare e anche vedendo il problema come un grafo non riesco a pensare ad una soluzione veloce.

Prova a pensare il problema come la visita in un grafo partendo dai nodi con L_i=0.

Grazie mille ho finalmente capito come risolverlo.

1 Mi Piace