Witam. Niedawno zacząłem rozwiązywać zadania na stronie POLSKI SPOJ. Rozwiązałem już kilka i postanowiłem rozwiązać zadanie z poziomu średniego. Wyniki są poprawne, ale sędzia oznajmia, że przekroczono limit czasu. W załączniku przesyłam zdjęcia jak rozpisałem te zadanie.
- Co można zrobić, aby przyspieszyć działanie algorytmu?
- Czy rozbicie na większą ilość własnych funkcji pomoże?
- A może mam zły sposób myślenia o tym zadaniu?
ZADANIE: SPEEDM - Pomiar Prędkości
http://pl.spoj.com/problems/SPEEDM/
#include <math.h>
#include <cstdio>
#include <vector>
using namespace std;
int t, n, max_v, min_v, _count1 = 0, _count2 = 1, licznik = 0, granica = 1;
vector <int> vector_tab;
int rec(int n)
{
if(n==1)
return 1;
else
return rec(n-1) + pow(2, n-1);
}
int dodaj(int n, int *tab)
{
vector_tab.push_back( tab[0] );
for(int j = 1; j < rec(n); j++)
{
if( j % 2 == 0)
{
vector_tab.push_back( vector_tab [_count1] + tab[_count2] );
_count1++;
licznik++;
}
else
vector_tab.push_back( vector_tab [_count1] - tab[_count2] );
if(licznik == granica){
granica = 2*licznik;
licznik=0;
_count2++;
}
}
min_v = vector_tab[0];
max_v = vector_tab[0];
for( int j = 1; j < rec(n); j++)
{
if( vector_tab[ j ] > max_v)
max_v = vector_tab[ j ];
if( vector_tab[ j ] < min_v && vector_tab[j] >= 0)
min_v = vector_tab[ j ];
}
printf("%d %d \n",min_v, max_v);
licznik = 0;
granica = 1;
_count1 = 0;
_count2 = 1;
delete [] tab;
vector_tab.clear();
}
int main()
{
scanf("%d", &t);
for(int i = 0; i < t; i++)
{
scanf("%d", &n);
int* tab = new int [n];
for(int j = 0; j < n; j++)
scanf("%d", &tab[j]);
dodaj(n, tab);
}
return 0;
}