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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
mNie podano opisu zmian
Daria (dyskusja | edycje)
Poprawianie formatowania
Linia 1: Linia 1:
Ta strona będzie zawierać podstawowe zadania na tablice.  
Ta strona zawiera podstawowe zadania na tablice.  


== Zadanie 1 (Flaga polska)==
== Zadanie 1 (Flaga polska)==
Linia 12: Linia 12:
#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.  


===Możliwe rozwiązania zadania 1===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 1 ===
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaPolska1(N,A);
  '''program''' FlagaPolska1(N,A);
Linia 29: Linia 28:
     '''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.
</div>
</div>
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.
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 2 ===
'''Rozwiązanie 2'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaPolska2(N,A);
  '''program''' FlagaPolska2(N,A);
Linia 51: Linia 50:
     '''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.   
</div>
</div>
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.   
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 3 ===
'''Rozwiązanie 3'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaPolska3(N,A);
  '''program''' FlagaPolska3(N,A);
Linia 84: Linia 83:
       '''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. 
</div>
</div>
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. 
</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'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaPolska4(N,A);
  '''program''' FlagaPolska4(N,A);
Linia 111: Linia 110:
żeby najpierw były elementy <0, potem =0, a na końcu >0.
żeby najpierw były elementy <0, potem =0, a na końcu >0.


=== Rozwiązanie 1 ===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' FlagaHolenderska(N,A);
  '''program''' FlagaHolenderska(N,A);
Linia 138: Linia 137:
najdłuższego stałego segmentu (spójnego fragmentu tablicy).
najdłuższego stałego segmentu (spójnego fragmentu tablicy).


===Możliwe rozwiązania zadania 3===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 1 ===
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' NajdluzszePlateau1(N,A);
  '''program''' NajdluzszePlateau1(N,A);
Linia 148: Linia 146:
   '''while''' p < N '''do''' '''begin'''
   '''while''' p < N '''do''' '''begin'''
     k:=p+1; koniec:=false;
     k:=p+1; koniec:=false;
     '''while''' (k <= N) and (not koniec) '''do'''
     '''while''' (k <= N) '''and''' ('''not''' koniec) '''do'''
       '''if''' A[k]=w '''then''' k:=k+1
       '''if''' A[k]=w '''then''' k:=k+1
       '''else''' koniec:=true;
       '''else''' koniec:=true;
Linia 160: Linia 158:


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 2 ===
'''Rozwiązanie 2'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' NajdluzszePlateau2(N,A);
  '''program''' NajdluzszePlateau2(N,A);
Linia 174: Linia 172:
     k:=k+1;
     k:=k+1;
   '''end''';
   '''end''';
  maks:=max(maks, dl);
  maks:=max(maks, dl);
  '''end'''.
  '''end'''.
</div>
</div>
</div>
</div>
A co by było gdyby tablica A była posortowana ?


== Zadanie 4 (Segment o maksymalnej sumie) ==
== Zadanie 4 (Segment o maksymalnej sumie) ==
Linia 185: Linia 181:
maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0.
maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0.


===Możliwe rozwiązania zadania 4===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Rozwiązanie trywialne, o kwadratowej złożoności:
'''Wskazówka 1'''  <div class="mw-collapsible-content" style="display:none">Najprostsze rozwiązanie ma złożoność  kwadratową.</div>
=== Rozwiązanie 1 ===
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' NajdluzszePlateau2(N,A);
  '''program''' NajdluzszePlateau2(N,A);
  '''var''' p,k,suma, maks: integer;
  '''var''' p,k,suma, maks: integer;
  '''begin'''
  '''begin'''
maks:=0;
  maks:=0;
'''for''' p:=1 '''to''' N '''do''' '''begin'''
  '''for''' p:=1 '''to''' N '''do''' '''begin'''
  suma:=0;
    suma:=0;
  '''for''' k:=p '''to''' N '''do''' '''begin'''
    '''for''' k:=p '''to''' N '''do''' '''begin'''
    suma:=suma+A[k];  
      suma:=suma+A[k];  
    maks:=max(maks,suma);
      maks:=max(maks,suma);
    '''end''';
   '''end''';
   '''end''';
'''end''';
  '''end'''.
  '''end'''.
</div>
</div>
Linia 206: Linia 203:


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Rozwiązanie liniowe:
'''Wskazówka 2'''  <div class="mw-collapsible-content" style="display:none">Optymalne rozwiązanie ma liniową złożoność.</div>
=== Rozwiązanie 1 ===
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 2'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' NajdluzszePlateau2(N,A);
  '''program''' NajdluzszePlateau2(N,A);
  '''var''' i,biez,maks: integer;
  '''var''' i,biez,maks: integer;
  '''begin'''
  '''begin'''
maks:=0;
  maks:=0;
biez:=0;
  biez:=0;
'''for''' i:=1 '''to''' N '''do''' '''begin'''
  '''for''' i:=1 '''to''' N '''do''' '''begin'''
  biez:=max(0,biez+A[i]);
    biez:=max(0,biez+A[i]);
  maks:=max(maks, biez);
    maks:=max(maks, biez);
'''end''';
  '''end''';
  '''end'''.
  '''end'''.
</div>
</div>
Linia 227: Linia 226:
zbiorów wypisać (operacją write) cześć wspólną tych zbiorów.
zbiorów wypisać (operacją write) cześć wspólną tych zbiorów.


=== Rozwiązanie 1 ===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' CescWspolna(N,A,B);
  '''program''' CescWspolna(N,A,B);
  '''var''' ia,ib: integer;
  '''var''' ia,ib: integer;
  '''begin'''
  '''begin'''
ia:=1; ib:=1;
  ia:=1; ib:=1;
'''while''' (ia <= N) and (ib <= N) '''do'''  
  '''while''' (ia <= N) '''and''' (ib <= N) '''do'''  
  '''if''' A[ia] < B[ib] '''then''' ia:=ia+1
    '''if''' A[ia] < B[ib] '''then''' ia:=ia+1
  '''else'''  
    '''else'''  
    '''if''' A[ia] > B[ib] '''then''' ib:=ib+1;
      '''if''' A[ia] > B[ib] '''then''' ib:=ib+1;
    '''else''' '''begin'''
      '''else''' '''begin'''
        write(A{ia], ' ');
          write(A{ia], ' ');
        ia:=ia+1;
          ia:=ia+1;
        ib:=ib+1;
          ib:=ib+1;
    '''end''';
      '''end''';
  '''end'''.
  '''end'''.
</div>
</div>
Linia 252: Linia 251:
zbiorów wypisać (operacją write) sumę tych zbiorów.
zbiorów wypisać (operacją write) sumę tych zbiorów.


===Możliwe rozwiązania zadania 6===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 1 ===
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Suma(N,A,B);
  '''program''' Suma(N,A,B);
  '''var''' ia,ib: integer;
  '''var''' ia,ib: integer;
  '''begin'''
  '''begin'''
ia:=1; ib:=1;  
  ia:=1; ib:=1;  
'''while''' (ia <= N) and (ib <= N) '''do'''  
  '''while''' (ia <= N) '''and''' (ib <= N) '''do'''  
  '''if''' A[ia] < B[ib] '''then''' '''begin'''
    '''if''' A[ia] < B[ib] '''then''' '''begin'''
    write(A{ia], ' ');
      write(A{ia], ' ');
    ia:=ia+1;
      ia:=ia+1;
  '''end'''
    '''end'''
  '''else'''  
    '''else'''  
    '''if''' A[ia] > B[ib] '''then''' '''begin'''
      '''if''' A[ia] > B[ib] '''then''' '''begin'''
      write(B{ib], ' ');
        write(B{ib], ' ');
      ib:=ib+1;
        ib:=ib+1;
    '''end'''  
      '''end'''  
    '''else''' '''begin'''
      '''else''' '''begin'''
        write(A{ia], ' ');
        write(A{ia], ' ');
        ia:=ia+1;
        ia:=ia+1;
        ib:=ib+1;
        ib:=ib+1;
    '''end''';
      '''end''';
'''while''' ia <= N '''do''' write(A{ia], ' ');
  '''while''' ia <= N '''do''' write(A{ia], ' ');
'''while''' ib <= N '''do''' write(B{ib], ' ');
  '''while''' ib <= N '''do''' write(B{ib], ' ');
  '''end'''.
  '''end'''.
</div>
</div>
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 2 ===
'''Rozwiązanie 2'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Suma(N,A,B);
  '''program''' Suma(N,A,B);
Linia 288: Linia 286:
  '''begin'''
  '''begin'''
   mniejsze:=false;
   mniejsze:=false;
   '''if''' (ib > N) and (ia <= N) '''then'''  mniejsze:=true
   '''if''' (ib > N) '''and''' (ia <= N) '''then'''  mniejsze:=true
   '''else''' '''if''' (ib <= N) and (ia <= N) '''then'''   
   '''else''' '''if''' (ib <= N) '''and''' (ia <= N) '''then'''   
     '''if''' A[ia] < B[ib] '''then''' mniejsze:=true
     '''if''' A[ia] < B[ib] '''then''' mniejsze:=true
  '''end''';     
  '''end''';     
  '''begin'''
  '''begin'''
ia:=1;  
  ia:=1;  
ib:=1;  
  ib:=1;  
'''while''' (ia <= N) or (ib <= N) '''do'''  
  '''while''' (ia <= N) '''or''' (ib <= N) '''do'''  
  '''if''' mniejsze(ia,ib) '''then''' '''begin'''
    '''if''' mniejsze(ia,ib) '''then''' '''begin'''
    write(A{ia], ' ');
      write(A{ia], ' ');
    ia:=ia+1;
      ia:=ia+1;
  '''end'''
    '''end'''
  '''else'''  
    '''else'''  
    '''if''' mniejsze(ib,ia) '''then''' '''begin'''
      '''if''' mniejsze(ib,ia) '''then''' '''begin'''
      write(B{ib], ' ');
        write(B{ib], ' ');
      ib:=ib+1;
        ib:=ib+1;
    '''end'''  
      '''end'''  
    '''else''' '''begin'''
      '''else''' '''begin'''
        write(A{ia], ' ');
          write(A{ia], ' ');
        ia:=ia+1;
          ia:=ia+1;
        ib:=ib+1;
          ib:=ib+1;
    '''end''';
      '''end''';
  '''end'''.
  '''end'''.
</div>
</div>
Linia 316: Linia 314:
== Zadanie 7 (Podciąg) ==
== 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)]).
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 ===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Podciag(N,A,M,B);
  '''program''' Podciag(N,A,M,B);
Linia 323: Linia 321:
     istnieje: boolean;
     istnieje: boolean;
  '''begin'''
  '''begin'''
'''if''' N > M then istnieje:=false
  '''if''' N > M '''then''' istnieje:=false
'''else''' '''begin'''
  '''else''' '''begin'''
  ia:=1;ib:=1;
    ia:=1;ib:=1;
  '''while''' (ia <= N) and (ib <= M) '''do'''
    '''while''' (ia <= N) '''and''' (ib <= M) '''do'''
    '''if''' A[ia] <> B[ib] '''then''' ib:=ib+1;
      '''if''' A[ia] <> B[ib] '''then''' ib:=ib+1;
    '''else''' '''begin'''
      '''else''' '''begin'''
      ia:=ia+1;
        ia:=ia+1;
      ib:=ib+1;
        ib:=ib+1;
    '''end''';
      '''end''';
  istnieje:=(ia>N);
    istnieje:=(ia>N);
   '''end''';
   '''end''';
  '''end'''.
  '''end'''.
Linia 340: Linia 338:
== Zadanie 8 (Odwracanie tablicy) ==
== 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.
Dana tablica A typu array[0..N-1] of integer, N > 1. Napisz program odwracający kolejność elementów w A.
=== Rozwiązanie 1 ===
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Odwracanie(N,A);
  '''program''' Odwracanie(N,A);
  '''var''' p,k,pom: integer;
  '''var''' p,k,pom: integer;
  '''begin'''
  '''begin'''
p:=0; k:=N-1;
  p:=0; k:=N-1;
'''while''' p < k '''do''' '''begin'''
  '''while''' p < k '''do''' '''begin'''
  pom:=A[p];
    pom:=A[p];
  A[p]:=A[k];
    A[p]:=A[k];
  A[k]:=pom;
    A[k]:=pom;
  p:=p+1;
    p:=p+1;
  k:=k-1;
    k:=k-1;
'''end''';
  '''end''';
  '''end'''.
  '''end'''.
Można też odwracać jedynie część tablicy. Zapiszmy to w formie procedury
Można też odwracać jedynie część tablicy. Zapiszmy to w formie procedury
Linia 359: Linia 358:
  '''var''' pom: integer;
  '''var''' pom: integer;
  '''begin'''
  '''begin'''
'''while''' p < k '''do''' '''begin'''
  '''while''' p < k '''do''' '''begin'''
  pom:=A[p];
    pom:=A[p];
  A[p]:=A[k];
    A[p]:=A[k];
  A[k]:=pom;
    A[k]:=pom;
  p:=p+1;
    p:=p+1;
  k:=k-1;
    k:=k-1;
'''end''';
  '''end''';
  '''end'''.  
  '''end'''.  
</div>
</div>
Linia 372: Linia 371:
== Zadanie 9 (Przesunięcie cykliczne) ==
== 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.
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.
===Możliwe rozwiązania zadania ===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Najprościej rozwiązać to zadanie używając dodatkowej pamięci rozmiaru N.
Najprościej rozwiązać to zadanie używając dodatkowej pamięci rozmiaru N.
=== Rozwiązanie 1 ===
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Przesun1(N,A,k);
  '''program''' Przesun1(N,A,k);
Linia 381: Linia 379:
     P: array[0..N-1] of integer;
     P: array[0..N-1] of integer;
  '''begin'''
  '''begin'''
'''for'' i:=0 '''to''' N-1 '''do''' P[(i+k)mod N]:=A[i];
  '''for'' i:=0 '''to''' N-1 '''do''' P[(i+k)mod N]:=A[i];
'''for'' i:=0 '''to''' N-1 '''do''' A[i]:=P[i];
  '''for'' i:=0 '''to''' N-1 '''do''' A[i]:=P[i];
  '''end'''.
  '''end'''.
</div>
</div>
Linia 388: Linia 386:
Można też skorzystać z rozkladu na cykle elementów tablicy. Długość każdego takiego cyklu wynosi nww(N,k) a na dodatek pierwsze nwd(N,k) elementów należy do różnych cykli. Dodatkowym kosztem jest oczywiście obliczenie nww i nwd.  
Można też skorzystać z rozkladu na cykle elementów tablicy. Długość każdego takiego cyklu wynosi nww(N,k) a na dodatek pierwsze nwd(N,k) elementów należy do różnych cykli. Dodatkowym kosztem jest oczywiście obliczenie nww i nwd.  
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 2 ===
'''Rozwiązanie 2'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Przesun2(N,A,k);
  '''program''' Przesun2(N,A,k);
Linia 410: Linia 408:
Można też zauważyć, że przesunięcie cykliczne o k w prawo realizuje się porzez trzy odwrócenia pewnych segmentów w  tablicy. Procedura Odwroc pochodzi z zadania 8.  
Można też zauważyć, że przesunięcie cykliczne o k w prawo realizuje się porzez trzy odwrócenia pewnych segmentów w  tablicy. Procedura Odwroc pochodzi z zadania 8.  
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 3 ===
'''Rozwiązanie 3'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Przesun3(N,A,k);
  '''program''' Przesun3(N,A,k);
Linia 425: Linia 423:
Tablica A typu array[1..N] of integer zawiera pewną permutację liczb 1.. N. Napisz program wpisujący do A następną
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.
leksykograficznie permutację. Zakładamy, że permutacja w A nie jest ostatnia leksykograficznie.
=== Rozwiązanie 1 ===
'''Rozwiązanie 1'''
<div class="mw-collapsible mw-made=collapsible mw-collapsed">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed">   
Najpierw szukamy od tyłu pierwszego elementu, takiego że A[i] < A[i+1] (tu korzystamy z zalożenia że to nie
Najpierw szukamy od tyłu pierwszego elementu, takiego że A[i] < A[i+1] (tu korzystamy z zalożenia że to nie
Linia 450: Linia 448:
== Zadanie 11 (Segment o zadanej sumie)  ==
== 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 = \Sum_i \in [p ..k-1] A[i])
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 = \Sum_i \in [p ..k-1] A[i])
=== Rozwiązanie 1 ===
'''Rozwiązanie 1'''
<div class="mw-collapsible mw-made=collapsible mw-collapsed">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed">   
<div class="mw-collapsible-content" style="display:none">  
<div class="mw-collapsible-content" style="display:none">  
Linia 482: Linia 480:
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Najprościej jest dla każdego elementu policzyć liczbę wystąpień w tablicy. Jest to oczywiście rozwiązanie o kwadratowym koszcie czasowym.
Najprościej jest dla każdego elementu policzyć liczbę wystąpień w tablicy. Jest to oczywiście rozwiązanie o kwadratowym koszcie czasowym.
=== Rozwiązanie 1 ===
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Glosowanie1(N,A);
  '''program''' Glosowanie1(N,A);
Linia 489: Linia 487:
  i:=1;
  i:=1;
  zwyciezca:=0;
  zwyciezca:=0;
  '''while''' (i <= (N div 2) + 1) and (zwyciezca=0)'''do''' '''begin'''
  '''while''' (i <= (N div 2) + 1) '''and''' (zwyciezca=0)'''do''' '''begin'''
   ile:=0;
   ile:=0;
   '''for j:=1 '''to''' N '''do''' if A[i]=A[j] '''then''' ile:=ile+1;
   '''for j:=1 '''to''' N '''do''' if A[i]=A[j] '''then''' ile:=ile+1;
Linia 500: Linia 498:
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
To zadanie ma też (piękne) rozwiązanie liniowe. Składa się ono z dwu faz. W pierwszej wyznaczamy takie a, że jeśli jest zwycięzca, to jest nim a, w drugiej (banalnej) sprawdzamy czy a wygrał.
To zadanie ma też (piękne) rozwiązanie liniowe. Składa się ono z dwu faz. W pierwszej wyznaczamy takie a, że jeśli jest zwycięzca, to jest nim a, w drugiej (banalnej) sprawdzamy czy a wygrał.
=== Rozwiązanie 2 ===
'''Rozwiązanie 2'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' Glosowanie2(N,A);
  '''program''' Glosowanie2(N,A);
Linia 537: Linia 535:
* 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).  
* 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 ===
'''Rozwiązanie 1'''
<div class="mw-collapsible mw-made=collapsible mw-collapsed">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed">   
<div class="mw-collapsible-content" style="display:none">  
<div class="mw-collapsible-content" style="display:none">  
Linia 595: Linia 593:
== Zadanie INNE (Najdłuższy podciąg niemalejący) ==
== Zadanie INNE (Najdłuższy podciąg niemalejący) ==
Dana jest tablica A typu array[1..N] of integer, N > 1. Należy obliczyć długość najdłuższego podciągu niemalejącego w A.
Dana jest tablica A typu array[1..N] of integer, N > 1. Należy obliczyć długość najdłuższego podciągu niemalejącego w A.
=== Rozwiązanie 1 ===
'''Rozwiązanie 1'''
<div class="mw-collapsible mw-made=collapsible mw-collapsed">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed">   
Kluczowe jest użycie dodatkowej tablicy B rozmiaru N, w której pod indeksem i przechowuje się minimalną wartość kończącą podciąg niemalejący o długości i w dotychczas przejrzanej części tablicy A,  od 1 do k. Żeby uwzględnić A[k+1] należy w tablicy B odnależć miejsce na A[k+1] (najlepiej binarnie).
Kluczowe jest użycie dodatkowej tablicy B rozmiaru N, w której pod indeksem i przechowuje się minimalną wartość kończącą podciąg niemalejący o długości i w dotychczas przejrzanej części tablicy A,  od 1 do k. Żeby uwzględnić A[k+1] należy w tablicy B odnależć miejsce na A[k+1] (najlepiej binarnie).
Linia 622: Linia 620:




== Zadanie () ==
== Zadanie m ==
=== Rozwiązanie 1 ===
Napisz program
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1''' 
<div class="mw-collapsible-content" style="display:none">  
<div class="mw-collapsible-content" style="display:none">  
  '''program''' (N,A);
  '''program''' (N,A);
  '''var''' : integer;
  '''var''' : integer;
  '''begin'''
  '''begin'''
  writeln('To jest rozwiązanie 1')
  '''end'''.
  '''end'''.
</div>
</div>
</div>
</div>


== Zadanie () ==
== Zadanie n ==
===Możliwe rozwiązania zadania ===  
Napisz program n
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1''' 
<div class="mw-collapsible-content" style="display:none">
To jest wskazówka 1
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1'''
<div class="mw-collapsible-content" style="display:none">
'''program''' (N,A);
'''var''' : integer;
'''begin'''
  writeln('To jest rozwiązanie 1')
'''end'''.
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 2''' 
<div class="mw-collapsible-content" style="display:none">
To jest wskazówka 2
</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 2'''
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
  '''program''' (N,A);
  '''program''' (N,A);
  '''var''' : integer;
  '''var''' : integer;
  '''begin'''
  '''begin'''
  writeln('To jest rozwiązanie 2')
  '''end'''.
  '''end'''.
</div>
</div>
</div>
</div>

Wersja z 11:01, 11 lip 2006

Ta strona zawiera podstawowe zadania na tablice.

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:

  • 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.

Rozwiązanie 1

Rozwiązanie 2

Rozwiązanie 3

Rozwiązanie 4

Zadanie 2 (Flaga holenderska)

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

Rozwiązanie 1

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.

Najprościej rozwiązać to zadanie używając dodatkowej pamięci rozmiaru N. Rozwiązanie 1

Można też skorzystać z rozkladu na cykle elementów tablicy. Długość każdego takiego cyklu wynosi nww(N,k) a na dodatek pierwsze nwd(N,k) elementów należy do różnych cykli. Dodatkowym kosztem jest oczywiście obliczenie nww i nwd.

Rozwiązanie 2

Można też zauważyć, że przesunięcie cykliczne o k w prawo realizuje się porzez trzy odwrócenia pewnych segmentów w tablicy. Procedura Odwroc pochodzi z zadania 8.

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

Najpierw szukamy od tyłu pierwszego elementu, takiego że A[i] < A[i+1] (tu korzystamy z zalożenia że to nie ostatnia permutacja), potem szukamy na prawo od i najmniejszego większego od niego elementu k (uwaga: dużo wygodniej to robic od prawej strony!), potem zamieniamy te elementy i odwracamy kolejność elementów na prawo od i.

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 = \Sum_i \in [p ..k-1] A[i]) 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.

Możliwe rozwiązania zadania

Najprościej jest dla każdego elementu policzyć liczbę wystąpień w tablicy. Jest to oczywiście rozwiązanie o kwadratowym koszcie czasowym. Rozwiązanie 1

To zadanie ma też (piękne) rozwiązanie liniowe. Składa się ono z dwu faz. W pierwszej wyznaczamy takie a, że jeśli jest zwycięzca, to jest nim a, w drugiej (banalnej) sprawdzamy czy a wygrał. 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

Zadanie INNE (Najdłuższy podciąg niemalejący)

Dana jest tablica A typu array[1..N] of integer, N > 1. Należy obliczyć długość najdłuższego podciągu niemalejącego w A. Rozwiązanie 1

Kluczowe jest użycie dodatkowej tablicy B rozmiaru N, w której pod indeksem i przechowuje się minimalną wartość kończącą podciąg niemalejący o długości i w dotychczas przejrzanej części tablicy A, od 1 do k. Żeby uwzględnić A[k+1] należy w tablicy B odnależć miejsce na A[k+1] (najlepiej binarnie).


Zadanie m

Napisz program

Rozwiązanie 1

Zadanie n

Napisz program n

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2