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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Daria (dyskusja | edycje)
Nie podano opisu zmian
Daria (dyskusja | edycje)
Wprowadzilam 6 zadan
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===  
==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 ===  
Linia 104: Linia 103:
         c:=c+1;
         c:=c+1;
     '''end''';
     '''end''';
'''end'''.
</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,
ż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-content" style="display:none">
'''program''' FlagaHolenderska(N,A);
'''var''' m,r,w,pom : integer;
'''begin'''
  m:=1; r:=1; w:=N;
  '''while''' r <= w '''do'''
    '''if''' A[r]=0 '''then''' r:=r+1
    '''else'''
      '''if''' A[r]<0 '''then''' '''begin'''
        pom:=A[r]; A[r]:=A[m]; A[m]:=pom;
        m:=m+1;
        r:=r+1;
      '''end'''
      '''else''' '''begin'''
        pom:=A[r]; A[r]:=A[w]; A[w]:=pom;
        w:=w-1;
      '''end''';
'''end'''.
</div>
</div>
== 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).
===Możliwe rozwiązania zadania 3===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 1 ===
<div class="mw-collapsible-content" style="display:none">
'''program''' NajdluzszePlateau1(N,A);
'''var''' p,w,k,maks: integer;
'''begin'''
  p:=1; w:=A[p]; maks:=1;
  '''while''' p < N '''do''' '''begin'''
    k:=p+1; koniec:=false;
    '''while''' (k <= N) and (not koniec) '''do'''
      '''if''' A[k]=w '''then''' k:=k+1
      '''else''' koniec:=true;
    maks:=max(maks, k-p);
    p:=k;
    '''if''' p <= N '''then''' w:=A[p];
  '''end''';
  '''end'''.
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 2 ===
<div class="mw-collapsible-content" style="display:none">
'''program''' NajdluzszePlateau2(N,A);
'''var''' w,k,dl,maks: integer;
'''begin'''
  w:=A[1]; dl:=1; k:=2; maks:=1;
  '''while''' k <= N '''do''' '''begin'''
    '''if''' A[k]=w '''then''' dl:=dl+1
    '''else''' '''begin'''
      maks:=max(maks, dl);
      dl:=1;
    '''end''';
    k:=k+1;
  '''end''';
  maks:=max(maks, dl);
'''end'''.
</div>
</div>
A co by było gdyby tablica A była posortowana ?
== 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.
===Możliwe rozwiązania zadania 4===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Rozwiązanie trywialne, o kwadratowej złożoności:
=== Rozwiązanie 1 ===
<div class="mw-collapsible-content" style="display:none">
'''program''' NajdluzszePlateau2(N,A);
'''var''' p,k,suma, maks: integer;
'''begin'''
maks:=0;
'''for''' p:=1 '''to''' N '''do''' '''begin'''
  suma:=0;
  '''for''' k:=p '''to''' N '''do''' '''begin'''
    suma:=suma+A[k];
    maks:=max(maks,suma);
  '''end''';
'''end''';
'''end'''.
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Rozwiązanie liniowe:
=== Rozwiązanie 1 ===
<div class="mw-collapsible-content" style="display:none">
'''program''' NajdluzszePlateau2(N,A);
'''var''' i,biez,maks: integer;
'''begin'''
maks:=0;
biez:=0;
'''for''' i:=1 '''to''' N '''do''' '''begin'''
  biez:=max(0,biez+A[i]);
  maks:=max(maks, biez)
'''end''';
'''end'''.
</div>
</div>
== 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 ===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible-content" style="display:none">
'''program''' CescWspolna(N,A,B);
'''var''' ia,ib: integer;
'''begin'''
ia:=1; ib:=1;
'''while''' (ia <= N) and (ib <= N) '''do'''
  '''if''' A[ia] < B[ib] '''then''' ia:=ia+1
  '''else'''
    '''if''' A[ia] > B[ib] '''then''' ib:=ib+1;
    '''else''' '''begin'''
        write(A{ia], ' ');
        ia:=ia+1;
        ib:=ib+1;
    '''end''';
'''end'''.
</div>
</div>
== 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.
===Możliwe rozwiązania zadania 6===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 1 ===
<div class="mw-collapsible-content" style="display:none">
'''program''' Suma(N,A,B);
'''var''' ia,ib: integer;
'''begin'''
ia:=1; ib:=1;
'''while''' (ia <= N) and (ib <= N) '''do'''
  '''if''' A[ia] < B[ib] '''then''' '''begin'''
    write(A{ia], ' ');
    ia:=ia+1;
  '''end'''
  '''else'''
    '''if''' A[ia] > B[ib] '''then''' '''begin'''
      write(B{ib], ' ');
      ib:=ib+1;
    '''end'''
    '''else''' '''begin'''
        write(A{ia], ' ');
        ia:=ia+1;
        ib:=ib+1;
    '''end''';
'''while''' ia <= N '''do''' write(A{ia], ' ');
'''while''' ib <= N '''do''' write(B{ib], ' ');
'''end'''.
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
=== Rozwiązanie 2 ===
<div class="mw-collapsible-content" style="display:none">
'''program''' Suma(N,A,B);
'''var''' ia,ib: integer;
'''function mniejsze(ia, ib: integer):boolean;
'''begin'''
  mniejsze:=false;
  '''if''' (ib > N) and (ia <= N) '''then'''  mniejsze:=true
  '''else''' '''if''' (ib <= N) and (ia <= N) '''then''' 
    '''if''' A[ia] < B[ib] '''then''' mniejsze:=true
'''end''';   
'''begin'''
ia:=1;
ib:=1;
'''while''' (ia <= N) or (ib <= N) '''do'''
  '''if''' mniejsze(ia,ib) '''then''' '''begin'''
    write(A{ia], ' ');
    ia:=ia+1;
  '''end'''
  '''else'''
    '''if''' mniejsze(ib,ia) '''then''' '''begin'''
      write(B{ib], ' ');
      ib:=ib+1;
    '''end'''
    '''else''' '''begin'''
        write(A{ia], ' ');
        ia:=ia+1;
        ib:=ib+1;
    '''end''';
'''end'''.
</div>
</div>
== Zadanie () ==
=== Rozwiązanie 1 ===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible-content" style="display:none">
'''program''' (N,A);
'''var''' : integer;
'''begin'''
'''end'''.
</div>
</div>
== Zadanie () ==
===Możliwe rozwiązania zadania ===
<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'''
  '''end'''.
  '''end'''.
</div>
</div>
</div>
</div>

Wersja z 14:57, 7 lip 2006

Ta strona będzie 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.

Możliwe rozwiązania zadania 1

Rozwiązanie 1

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.

Rozwiązanie 2

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.

Rozwiązanie 3

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.

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

Możliwe rozwiązania zadania 3

Rozwiązanie 1

Rozwiązanie 2

A co by było gdyby tablica A była posortowana ?

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.

Możliwe rozwiązania zadania 4

Rozwiązanie trywialne, o kwadratowej złożoności:

Rozwiązanie 1

Rozwiązanie liniowe:

Rozwiązanie 1

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.

Możliwe rozwiązania zadania 6

Rozwiązanie 1

Rozwiązanie 2

Zadanie ()

Rozwiązanie 1

Zadanie ()

Możliwe rozwiązania zadania

Rozwiązanie 1