Zadanie - program wywłaszczony

0

Witam zadanie ze strony: http://main.edu.pl/pl/archive/oi/18/liz

W testach dostaje 14/100 - powód program wywłaszczony i nie wiem dlaczego proszę o pomoc. Mój kod:

 

#include <iostream>
using namespace std;

int main()
{	
	long long int l_smakow, l_cen, cena;
		
	cin >> l_smakow;
	cin >> l_cen;
	
	char tab[l_smakow+1];
	long  long int tabela[l_smakow];
	
	for(long long int i=0; i<l_smakow; i++)	
		{
		cin>>tab[i];		
		
		
		if(tab[i] == 'T' || tab[i] == 't')
		
			tabela[i] = 2;
			
		else 
			
			tabela[i] = 1;
	
		}
		
	for(long long int i = 0; i < l_cen; i++)
		
		{
		long long int start = 0, stop = 0;
		
		cin >> cena;
		
		long long int zrobione = 0;
						
		for(long long int j = 0; j < l_smakow; j++)
		
		
			{
				start = j;
								
				long long int suma = 0;
				
				for(long long int k = j; k < l_smakow; k++)
					
					{
						stop = k;
						
						suma = suma + tabela[k];
						
						if(suma == cena)
							{
								zrobione = 1;
								break;
							}					
						
						if(suma > cena)
							break;
							
											
					}
				if(zrobione)
					
					break;			
			}			
		
		if(!zrobione)
			cout<< "NIE" << endl;
			
		else			
			cout<< start + 1  << " " << stop + 1 << endl;	
				
		}						
	return 0;
}
1
char tab[l_smakow+1];

Tak się nie tworzy tablic dynamicznych...

2.Czemu zmienna zrobione nie jest po prostu bool'em?

0

„program wywłaszczony” oznacza, że program wykonywał się zbyt długo (przekroczył zadany maksymalny czas albo się zawiesił) i został ubity.

0

Zrobiłem tablice dynamiczne(?) i wciąż program wywłaszczony:

 
#include <iostream>
using namespace std;

int main()
{	
	long long int l_smakow, l_cen, cena;
	
	
	long long * wskaznik2;
	char * wskaznik;    
		
	cin >> l_smakow;
	cin >> l_cen;
	wskaznik = new char[l_smakow]; 
	wskaznik2 = new long long[l_smakow];
	
	
	for(long long int i=0; i<l_smakow; i++)	
		{
		cin>>wskaznik[i];		
		
		
		if(wskaznik[i] == 'T')
		
			wskaznik2[i] = 2;
			
		else 
			
			wskaznik2[i] = 1;
	
		}
		
	for(long long int i = 0; i < l_cen; i++)
		
		{
		long long int start = 0, stop = 0;
		
		cin >> cena;
		
		long long int zrobione = 0;
						
		for(long long int j = 0; j < l_smakow; j++)
		
		
			{
				start = j;
								
				long long int suma = 0;
				
				for(long long int k = j; k < l_smakow; k++)
					
					{
						stop = k;
						
						suma = suma + wskaznik2[k];
						
						if(suma == cena)
							{
								zrobione = 1;
								break;
							}					
						
						if(suma > cena)
							break;
							
											
					}
				if(zrobione)
					
					break;			
			}			
		
		if(!zrobione)
			cout<< "NIE" << endl;
			
		else			
			cout<< start + 1  << " " << stop + 1 << endl;	
				
		}						
	return 0;
}
1

kodu nie analizowalem, ale pomoge przyspieszyc Ci wypisywanie na ekran:
1 linijka w main: ios_base::sync_with_stdio(false);
wszystko co pasuje pod schemat: cout << "cos" << endl; zamien na: cout << "cos\n"; endl oprocz wypisania nowej linii flush przez co tracisz korzysc buforowania cout

0

Niewiele z tego kodu widać bo jest beznadziejnie napisany. Po czym to wniskuje? Bo nie mam pojęcia co ten kod robi - dobry kod to taki gdzie od razu widać. Kod ma złożoność O(l_cenl_smakowl_smakow) czyli O(m*n^2) a to jest dość wysoka złożoność, bo można to zadanie rozwiązać niższym czasie.
Jak? Na przykład tak:
Lecimy po lizaku i dla każego segmentu w magicznej tablicy zapisujemy ile kosztuje lizak od początku do tego segmentu (tzn indeksem tej tablicy jest K a wartością jest jedna z par (początek,koniec) z których można K uzyskać).
Możemy po wypełnieniu tablicy w ten sposób od razu wypełnić część pozostałych wartości K bo jeśli weźmiemy sobie dwa wpisy w tablicy o indeksach K1 i K2 to do komórki K1-K2 możemy wpisać parę (K2_koniec,K1_koniec). Koniec końców wynik możemy z tej tablicy odczytać w czasie O(1).

Pewnie da sie szybciej, ale to bylo pierwsze co mi przyszło do głowy ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1