Przesuwanie elementów tablicy - SPOJ.

Przesuwanie elementów tablicy - SPOJ.
Szymon Dolnik
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:1
0

Witam!
Zmierzyłem się z problemem ze SPOJ'a(https://pl.spoj.com/problems/PP0602D/). Napisałem kod który działa, ale nie wydaje mi się zbyt poprawny(SPOJ go przyjął). Chciałbym żeby ktoś pokazał, lub podpowiedział jak zrobić to w 100% poprawnie. (Pisane w CodeBlock'sie).

Kopiuj
#include <iostream>

using namespace std;

int main(){
    int t, k, n[100];

    cin >> t >> k;
    for(int i=0; i<t; i++){
        cin >> n[i];
    }
    for(int i=0+k; i!=k-1; i++){
        if(i==t){
            i=0;
            k++;
        }
        cout << n[i] << " ";
    }

    return 0;
}

#EDIT Wiem, że powinienem dodać warunki jeśli chodzi o 1 < t < k < 10000.

edytowany 2x, ostatnio: flowCRANE
flowCRANE
Tagowanie wątków, Formatowanie treści – zapoznaj się z tymi artykułami.
tajny_agent
  • Rejestracja:ponad 11 lat
  • Ostatnio:ponad rok
  • Postów:1340
1

:P

Kopiuj
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>

int main(int argc, char** argv)
{
   int count, shift;
   std::cin >> count >> shift;
   std::vector< int > numbs;
   numbs.reserve( count );
   std::copy_n( std::istream_iterator< int >( std::cin ), count, std::back_inserter( numbs ) );
   std::rotate( numbs.begin(), numbs.begin() + shift, numbs.end() );
   std::copy( numbs.begin(), numbs.end(), std::ostream_iterator< int >( std::cout, " " ) );
   return 0;
}

"I love C++. It's the best language in the world right now for me to write the code that i need and want to write"
~ Herb Sutter
Szymon Dolnik
Okej. Dzięki za odpowiedź. Jeszcze długa droga przede mną, bo z tego co napisałeś rozumiem dosłownie szczątki.
Pebal
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad rok
  • Postów:111
0
Kopiuj
#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    using namespace std;

    int n, k;
    cin >> n >> k;

    // utworzenie tablicy o rozmiarze k
    vector<int> v(k);

    // wczytanie k elementów do tablicy
    copy_n(istream_iterator<int>(cin), k, v.begin());

    // wczytanie i wyświetlenie pozostałych elementów (n-k)
    copy_n(istream_iterator<int>(cin), n - k, ostream_iterator<int>(cout, " "));

    // wyświetlenie k elementów z tablicy
    copy_n(v.begin(), k, ostream_iterator<int>(cout, " "));

    return 0;
}
edytowany 1x, ostatnio: Pebal
vpiotr
  • Rejestracja:prawie 14 lat
  • Ostatnio:prawie 3 lata
0

To zadanie ma optymalną złożoność obliczeniową O(n) - z tego co wiem, i pamięciową O(1)
Czyli nie wymaga żadnych przesunięć w pamięci.

Pebal
To zadanie nie wymaga przesunięć w pamięci, ale złożoność pamięciową ma O(k).
vpiotr
Nie wymaga żadnej dodatkowej pamięci, więc O(1)
vpiotr
No chyba że liczymy pamięć na dane wejściowe - no to OK, O(n).
Pebal
O(k), gdyż tutaj nie trzeba pamiętać wszystkich danych.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.