Ćwiczenia do Modułu 1: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Daria (dyskusja | edycje)
Koszty i wskazowki
Linia 8: Linia 8:


== Zadanie 1 (Flaga polska)==
== Zadanie 1 (Flaga polska)==
Tablica A typu array[1..N] of integer (N > 0) wypełniona zerami i jedynkami reprezentuje ciąg N urn w których znajdują się żetony białe (0) i czerwone (1). Należy podać algorytm działania automatu przestawiającego żetony w urnach tak, by najpierw były żetony białe, potem czerwone. Robot może wykonywać dwa rodzaje operacji:
Tablica A typu array[1..N] of integer (N > 0) wypełniona zerami i jedynkami reprezentuje ciąg N urn w których znajdują się żetony białe (0) i czerwone (1). Podaj algorytm działania automatu przestawiającego żetony w urnach tak, by najpierw były żetony czerwone, potem białe. Robot może wykonywać dwa rodzaje operacji:


*Kol(i) - podaje kolor żetonu w i-tej urnie (1 ≤ i ≤ n)
*Kol(i) - podaje kolor żetonu w i-tej urnie (1 ≤ i ≤ n)
Linia 18: Linia 18:
#Nie można założyć, że występuje choć jeden żeton w każdym z kolorów.  
#Nie można założyć, że występuje choć jeden żeton w każdym z kolorów.  


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1'''
<div class="mw-collapsible-content" style="display:none">
Należy przesuwać się indeksem c od początku tablicy zaś indeksem b od końca. Intencją jest utrzymywanie następującego niezmmiennika: wszystkie elementy tablicy o indeksach mniejszych od c są czerwone, zaś wiekszych od b są białe. Indeksy c i b będą się do siebie zbliżać i ostatecznie gdy c będzie równe b to tablica będzie uporządkowana.
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1'''  
'''Rozwiązanie 1'''  
Linia 26: Linia 32:
  '''var''' b,c : integer;
  '''var''' b,c : integer;
  '''begin'''
  '''begin'''
   b:=1; c:=n;
   c:=1; b:=n;
   '''while''' b < c '''do'''  
   '''while''' c < b '''do'''  
     '''if''' Kol(b)=bialy '''then''' b:=b+1
     '''if''' Kol(c)=czerwony '''then''' c:=c+1
     '''else''' '''begin'''
     '''else''' '''begin'''
       Z(c,b);
       Z(c,b);
       c:=c-1;
       b:=b-1;
     '''end''';
     '''end''';
  '''end'''.
  '''end'''.
Rozwiązanie 1 optymalizuje liczbę sprawdzeń kolorów, ale może niepotrzebnie zamieniać czerwone z czerwonymi. Mozna tego uniknąć wprowadzając dodatkową pętlę po czerwonych od końca tablicy.
''Koszt czasowy'': liniowy względem N
 
''Koszt pamięciowy'': stały
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 2'''
<div class="mw-collapsible-content" style="display:none">
Rozwiązanie 1 optymalizuje liczbę sprawdzeń kolorów, ale może niepotrzebnie zamieniać białe z białymi. Można tego uniknąć wprowadzając dodatkową pętlę po białych od końca tablicy.
</div>
</div>
</div>
</div>
Linia 45: Linia 59:
  '''var''' b,c : integer;
  '''var''' b,c : integer;
  '''begin'''
  '''begin'''
   b:=1; c:=n;
   c:=1; b:=n;
   '''while''' b < c '''do'''  
   '''while''' c < b '''do'''  
     '''if''' Kol(b)=bialy '''then''' b:=b+1
     '''if''' Kol(c)=czerwony '''then''' c:=c+1
     '''else''' '''begin'''
     '''else''' '''begin'''
       '''while''' Kol(c)=czerwony '''and''' (b<c) '''do''' c:=c-1;
       '''while''' Kol(b)=biały '''and''' (c<b) '''do''' b:=b-1;
       '''if''' b<c '''then''' '''begin'''
       '''if''' b<c '''then''' '''begin'''
         Z(c,b);
         Z(c,b);
         c:=c-1;
         b:=b-1;
       '''end''';
       '''end''';
     '''end''';
     '''end''';
  '''end'''.
  '''end'''.
W rozwiązaniu 2 są dwie zagnieżdżone pętle while. Trzeba zwrócić uwagę, że gdyby nie warunek b<c to w przypadku tablicy zawierającej same białe żetony doszłoby do wyjścia poza zakres (odwołanie do Kol(0)). Można uniknąć zagnieżdżonych while'i; trzeba jednak uważać aby nie sprawdzać kilka razy koloru tego samego żetonu.    
W rozwiązaniu 2 są dwie zagnieżdżone pętle while. Trzeba zwrócić uwagę, że gdyby nie warunek c<b to w przypadku tablicy zawierającej same białe żetony doszłoby do wyjścia poza zakres (odwołanie do Kol(0)).  
 
''Koszt czasowy'': liniowy względem N
 
''Koszt pamięciowy'': stały
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 3'''
<div class="mw-collapsible-content" style="display:none">
W Rozwiązaniu 2 można uniknąć zagnieżdżonych while'i, trzeba jednak uważać aby nie sprawdzać kilka razy koloru tego samego żetonu.
</div>
</div>
</div>
</div>
Linia 65: Linia 89:
  '''const''' bialy = 0;
  '''const''' bialy = 0;
       czerwony = 1;
       czerwony = 1;
  '''var''' b,c : integer;
  '''var''' b,c,kb,kc : integer;
  '''begin'''
  '''begin'''
   b:=1; kb:=Kol(b);
   c:=1; kc:=Kol(c);
   c:=n; kc:=Kol(c);
   b:=n; kc:=Kol(b);
   '''while''' b < c '''do'''  
   '''while''' c < b '''do'''  
     '''if''' kb=bialy '''then''' '''begin'''  
     '''if''' kc=czerwony '''then''' '''begin'''  
       b:=b+1;
       c:=c+1;
       kb:=Kol(b);
       kc:=Kol(c);
     '''end'''
     '''end'''
     '''else'''  
     '''else'''  
       '''if''' kc=czerwony '''then''' '''begin'''
       '''if''' kb=biały '''then''' '''begin'''
         c:=c-1;
         b:=b-1;
         kc:=Kol(c);
         kb:=Kol(b);
       '''end'''  
       '''end'''  
       '''else''' '''begin'''
       '''else''' '''begin'''
         Z(c,b);
         Z(c,b);
         b:=b+1;  
         c:=c+1;  
         c:=c-1;
         b:=b-1;
         '''if''' b < c '''then''' '''begin'''
         '''if''' c < b '''then''' '''begin'''
          kc:=Kol(c);
           kb:=Kol(b);
           kb:=Kol(b);
          kc:=Kol(c);
         '''end;''';  
         '''end;''';  
       '''end;'''
       '''end;'''
  '''end'''.
  '''end'''.
W rozwiązaniu 3 każdy żeton jest sprawdzany co najwyżej raz, a każda zamiana ustawia na dobrych miejscach 2 żetony (czyli zamian jest co najwyżej N div 2). Alternatywne rozwiązanie, unikające zagnieżdżonych pętli jest poniżej. Jednak dla tablicy złożonej z jednego żetonu czerwonego i potem samych białych będzie potrzeba N-1 zamian.   
W rozwiązaniu 3 każdy żeton jest sprawdzany co najwyżej raz, a każda zamiana ustawia na dobrych miejscach 2 żetony (inaczej mówiąc tych żetonów nie trzeba już będzie przestawiać). A więc wszystkich zamian jest co najwyżej N div 2. Alternatywne rozwiązanie, unikające zagnieżdżonych pętli jest poniżej.  
 
''Koszt czasowy'': liniowy względem N
 
''Koszt pamięciowy'': stały
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 4'''
<div class="mw-collapsible-content" style="display:none">
Alternatywne rozwiązanie, unikające zagnieżdżonych pętli jest poniżej. Tu oba indeksy b i c przesuwają się od początku tablicy a niezmiennikiem jest to, że wszystkie elementy tablicy o indeksach mniejszych od c są czerwone, zaś te o indeksach wiekszych równych od c i miejszych od b są białe.
</div>
</div>
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 4'''  
'''Rozwiązanie 4'''  
Linia 100: Linia 135:
  '''var''' b,c : integer;
  '''var''' b,c : integer;
  '''begin'''
  '''begin'''
   b:=1; c:=1;
   c:=1; b:=1;
   '''while''' b <= N '''do'''  
   '''while''' c <= N '''do'''  
     '''if''' Kol(c)=czerwony '''then''' c:=c+1
     '''if''' Kol(b)=biały '''then''' b:=b+1
     '''else''' '''begin'''
     '''else''' '''begin'''
         Z(c,b);
         Z(c,b);
Linia 109: Linia 144:
     '''end''';
     '''end''';
  '''end'''.
  '''end'''.
''Koszt czasowy'': liniowy względem N
''Koszt pamięciowy'': stały
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Pytanko 1'''
<div class="mw-collapsible-content" style="display:none">
Dla jakich danych algorytm przedstawiony w Rozwiązaniu 4 dokona N-1 zamian?
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Pytanko 2'''
<div class="mw-collapsible-content" style="display:none">
Jak trzeba by zmienić powyższe rozwiązania, gdyby zamiana Z(i,j) była dozwolona tylko dla i <> j ?
</div>
</div>
</div>
</div>


== Zadanie 2 (Flaga holenderska) ==
 
Dana jest tablica A typu array[1..N] of integer (N > 0). Należy tak poprzestawiać w niej elementy,
== Zadanie 2 (Flaga trójkolorowa) ==
żeby najpierw były elementy <0, potem =0, a na końcu >0.
Dana jest tablica A typu array[1..N] of integer (N > 0). Należy tak poprzestawiać w niej elementy, żeby najpierw były elementy ujemne, potem równe zero, a na końcu dodatnie.


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1'''
<div class="mw-collapsible-content" style="display:none">
Rozwiązanie dla flagi trójkolorowej jest uogólnieniem rozwiązania dla flagi dwukolorowej. Rozwiązanie 1 poniżej jest kombinacją rozwiązań 3 i 4 z zadania 1; zaś Rozwiązanie 2 poniżej jest bezpośrednim uogólnieniem  rozwiązania 4 z zadania 1. Jeśli chodzi o liczbę zamian to lepsze wydaje się Rozwiązanie 1, gdyż od razu na dobre miejsca trafiają elementy ujemne i dodatnie.
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1'''  
'''Rozwiązanie 1'''  
Linia 124: Linia 180:
   m:=1; r:=1; w:=N;
   m:=1; r:=1; w:=N;
   '''while''' r <= w '''do'''  
   '''while''' r <= w '''do'''  
     '''if''' A[r]=0 '''then''' r:=r+1
     '''if''' A[r]=0 '''then''' r:=r+1   //przedluzam segment liczb dodatnich
     '''else'''  
     '''else'''  
       '''if''' A[r]<0 '''then''' '''begin'''
       '''if''' A[r]<0 '''then''' '''begin''' //zamieniam wartosci w A[r] i A[m]
         pom:=A[r]; A[r]:=A[m]; A[m]:=pom;
         pom:=A[r]; A[r]:=A[m]; A[m]:=pom;   //po zamianie A[r]=0, A[m] < 0 wiec
         m:=m+1;
         m:=m+1;       //zwiekszam oba indeksy r i m
         r:=r+1;
         r:=r+1;
       '''end'''
       '''end'''
       '''else''' '''begin'''
       '''else''' '''begin'''
         pom:=A[r]; A[r]:=A[w]; A[w]:=pom;
         pom:=A[r]; A[r]:=A[w]; A[w]:=pom;   //zamieniam wartosci w A[r] i A[w]
         w:=w-1;
         w:=w-1;     //po zamianie A[w]>0,
      '''end''';     //ale o A[r] nic nie wiem
'''end'''.
''Koszt czasowy'': liniowy względem N
 
''Koszt pamięciowy'': stały
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 2'''
<div class="mw-collapsible-content" style="display:none">
'''program''' FlagaHolenderska(N,A);
'''var''' m,r,w,pom : integer;
'''begin'''
  m:=1; r:=1; w:=1;
  '''while''' w <= N '''do'''
    '''if''' A[w]>0 '''then''' w:=w+1 //przedluzam segment liczb dodatnich
    '''else'''
      '''if''' A[w]=0 '''then''' '''begin'''
        pom:=A[r]; A[r]:=A[w]; A[w]:=pom; //zamieniam wartosci w A[r] i A[w], /po zamianie A[r]=0, A[w] >0
        w:=w+1; //wiec zwiekszam oba indeksy r i w
        r:=r+1;
      '''end'''
      '''else''' '''begin''' //zamieniam cyklicznie A[m], A[r] i A[w]
        pom:=A[m]; A[m]:=A[w]; A[w]:=A[r]; A[r]:=pom;
        m:=m+1;
        r:=r+1;
        w:=w+1;  
       '''end''';
       '''end''';
  '''end'''.
  '''end'''.
''Koszt czasowy'': liniowy względem N
''Koszt pamięciowy'': stały
</div>
</div>
</div>
</div>

Wersja z 18:46, 14 lip 2006

Ta strona zawiera podstawowe zadania na tablice.

Ogladaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__


Zadanie 1 (Flaga polska)

Tablica A typu array[1..N] of integer (N > 0) wypełniona zerami i jedynkami reprezentuje ciąg N urn w których znajdują się żetony białe (0) i czerwone (1). Podaj algorytm działania automatu przestawiającego żetony w urnach tak, by najpierw były żetony czerwone, potem białe. Robot może wykonywać dwa rodzaje operacji:

  • Kol(i) - podaje kolor żetonu w i-tej urnie (1 ≤ i ≤ n)
  • Z(i,j) - zamienia żetony z i-tej i j-tej urny (1 ≤ i,j ≤ n)

Uwagi:

  1. Operacja Kol jest bardzo kosztowna, więc zależy nam na tym by kolor każdego żetonu był sprawdzany co najwyżej raz.
  2. Robot potrafi zapamiętać tylko kilka wartości z przedziału 0..N+1.
  3. Nie można założyć, że występuje choć jeden żeton w każdym z kolorów.

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Wskazówka 3

Rozwiązanie 3

Wskazówka 4

Rozwiązanie 4

Pytanko 1

Pytanko 2


Zadanie 2 (Flaga trójkolorowa)

Dana jest tablica A typu array[1..N] of integer (N > 0). Należy tak poprzestawiać w niej elementy, żeby najpierw były elementy ujemne, potem równe zero, a na końcu dodatnie.

Wskazówka 1

Rozwiązanie 1

Rozwiązanie 2

Zadanie 3 (Najdłuższe plateau)

Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 1, długość najdłuższego stałego segmentu (spójnego fragmentu tablicy).

Rozwiązanie 1

Rozwiązanie 2

Zadanie 4 (Segment o maksymalnej sumie)

Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 1, maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0.

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Zadanie 5 (Część wspólna zbiorów)

Dane są dwie tablice A i B typu array[1..N] of integer, N > 1. Obie są posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu zbiorów wypisać (operacją write) cześć wspólną tych zbiorów.

Rozwiązanie 1

Zadanie 6 (Suma zbiorów)

Dane są dwie tablice A i B typu array[1..N] of integer, N > 1. Obie są posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu zbiorów wypisać (operacją write) sumę tych zbiorów.

Rozwiązanie 1

Rozwiązanie 2

Zadanie 7 (Podciąg)

Dane są dwie tablice A typu array[1..N] of integer i B typu array[1..M] of integer, N, M > 1. Napisz program sprawdzający, czy A jest podciągiem B (tzn. czy istnieje funkcja f, rosnąca, z 1..N w 1..M, t. ze A[i]=B[f(i)]).

Rozwiązanie 1

Zadanie 8 (Odwracanie tablicy)

Dana tablica A typu array[0..N-1] of integer, N > 1. Napisz program odwracający kolejność elementów w A.

Rozwiązanie 1

Zadanie 9 (Przesunięcie cykliczne)

Dana tablica A typu array[0..N-1] of integer, N > 1, i liczba naturalna k > 1. Napisz program realizujący przesunięcie cykliczne w prawo o k pól, czyli przesuwający zawartość pola A[i] na A[(i+k) mod N] dla każdego i < N.

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Wskazówka 3

Rozwiązanie 3

Zadanie 10 (Następna permutacja)

Tablica A typu array[1..N] of integer zawiera pewną permutację liczb 1.. N. Napisz program wpisujący do A następną leksykograficznie permutację. Zakładamy, że permutacja w A nie jest ostatnia leksykograficznie.

Rozwiązanie 1

Zadanie 11 (Segment o zadanej sumie)

Tablica A typu array[1..N] of integer zawiera tylko liczby dodatnie. Napisz program który dla danego W typu integer sprawdza czy w A istnieje segment o sumie W (czyli czy istnieją p, k takie, że W=A[p]+...+A[k1]).

Rozwiązanie 1

Zadanie 12 (Głosowanie większościowe)

Dana jest tablica A typu array[1..N] of integer, N > 1. Należy sprawdzić czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak wskazać go.

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Zadanie 13 (Arytmetyka liczb wielocyfrowych)

Liczby wielocyfrowe będą reprezentowane w tablicach typu liczba=array[0..N-1] of integer w taki sposób, że najmniej znacząca cyfra jest pod indeksem 0. Rozpatrujemy liczby przy podstawie b ≥ 1. Napisz procedury obliczające:

  • sumę liczb A i B do C. Jeśli wynik nie zmieści się w C to wartość C nie ma znaczenia. Zmienna przepełnienie wskazuje czy do niego doszło czy nie.
  • różnicę A i B do C. Jeśli wynik miałby byc liczbą ujemną to wartość C nie ma znaczenia. Zmienna ujemny wskazuje jaki jest znak wyniku.
  • iloczyn A i B do C (C powinno być tablicą dwa razy dłuższą niż A i B, żeby móc pomieścić wynik).

Rozwiązanie 1