• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tasma - MAIN2

Object Storage Arubacloud
+1 głos
919 wizyt
pytanie zadane 19 maja 2018 w C i C++ przez koniak20 Początkujący (390 p.)

Znowu mam delikatny problem z zadankiem z MAIN2 (mowa o tym: https://main2.edu.pl/c/konkurs-wstepu-do-programowania/p/tas/ )

Samo zadanie ,,zrobiłem" to znaczy działa bez zarzutów ale algorytm jest niewydajny ( przekracza mi maksymalnie o trzy setne sekundy, no ale przekracza :D ).

Tutaj mój kod:
 

#include <iostream>

int main()
{
    int n;
    std::cin>>n;
    long int a[n];
    std::cin>>a[0];
    bool prawda=true,koniec=false;
    for(int i=1; i<n; i++)
    {
        std::cin>>a[i];
        if(a[i-1]!=a[i])
            prawda=false;
    }
    if(prawda)
        std::cout<<"BRAK";
    else
    {
        long  int wynik=0,odleglosc=0;
        for(int i=0; i<n-1 && wynik<n-i; i++)
        {
            for(int j=n-1; j>i && !koniec; j--)
            {

                if(a[i] != a[j])
                {
                    odleglosc=j-i;
                    koniec=true;
                }
            }
            koniec=false;
            if (wynik<odleglosc)
                wynik=odleglosc;

        }
        std::cout<<wynik;
    }

}

 

1 odpowiedź

+1 głos
odpowiedź 19 maja 2018 przez RafalS VIP (122,820 p.)
edycja 19 maja 2018 przez RafalS
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;
}

 

komentarz 19 maja 2018 przez RafalS VIP (122,820 p.)
Kombinowałem coś z wczytywaniem całego inputu na raz, ale nic to nie dało. Podobnie przepisanie całości na czyste C.
komentarz 19 maja 2018 przez RafalS VIP (122,820 p.)
Podbijam pytanie bo sam nie wiem jak to ulepszyć

Podobne pytania

0 głosów
2 odpowiedzi 371 wizyt
pytanie zadane 2 stycznia 2017 w C i C++ przez Maciej Domański Nowicjusz (150 p.)
0 głosów
0 odpowiedzi 400 wizyt
pytanie zadane 18 sierpnia 2021 w C i C++ przez Kamila2000 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 366 wizyt
pytanie zadane 27 lipca 2019 w C i C++ przez niezalogowany

92,579 zapytań

141,431 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...