long int a[n];
To nie powinno zadziałać. Używaj dynamicznej alokacji, gdy chcesz zaalokować tablicę o rozmiarze nieznanym w czasie kompilacji.
for(int i=0; i<n-1 && wynik<n-i; i++)
Tutaj pierwszy warunek jest chyba zbędny i < n - wynik go pokrywa.
for(int j=n-1; j>i && !koniec; j--)
Zamiast flagi koniec używałbym break, może to minimalnie przyspieszyć program, a na pewno będzie on czytelniejszy. I to j>i. Ja bym dał j - i > wynik. Czyli dopóki dalsze poszukiwania mogą coś zmienić. Możliwe, że wyjdzie na to samo, bo nie mogę wymyślić przypadku, ale jest bardziej logiczne.
Generalnie w tym rozwiązaniu nie musisz też porównywać czy wynik < odległość bo algorytm jest tak napisany, że wynik nigdy nie spadnie.
A co do optymalizacji to napisałem to sam i też mi wychodzi i to nawet 4 ms ponad czas, więc co do algorytmu ciężko mi coś dodać. Sprawdziłem jedynie, że w testowanych przypadkach wykonuje minimum porównań. A to sugeruje, że trzeba poszukać gdzieś indziej tych 3 ms. Obstawiałbym, że wczytywanie przy pomocy cina nie jest optymalne. Spróbuje poeksperymentować i dam znać czy coś się udało.
Moje rozwiązanie:
#include <iostream>
using namespace std;
unsigned longestNotEqualDistance(unsigned array[], const unsigned length) {
unsigned longest = 0;
for (size_t i = 0; i < length - longest; i++)
{
for (size_t j = length - 1;j-i>longest ; j--)
{
if (array[i] != array[j]) {
longest = j-i;
break;
}
}
}
return longest;
}
int main() {
int N;
cin >> N;
unsigned * array = new unsigned[N];
bool areDifferent = false;
cin >> array[0];
for (size_t i = 1; i < N; i++)
{
cin >> array[i];
if (array[i] != array[i - 1])
areDifferent = true;
}
if (areDifferent) {
cout << longestNotEqualDistance(array, N);
}
else
cout << "BRAK" << endl;
delete[] array;
}