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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian
Chyba wszystko...
Linia 1: Linia 1:
Ta strona zawiera podstawowe zadania na tablice.
Ta strona zawiera podstawowe zadania na tablice. Ble ble


== Zadanie 1 (Flaga polska)==
== Zadanie 1 (Flaga polska)==
Linia 436: Linia 436:


== Zadanie 10 (Następna permutacja) ==
== 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ą
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.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1'''
'''Rozwiązanie 1''' 
<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
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.
<div class="mw-collapsible-content" style="display:none">  
<div class="mw-collapsible-content" style="display:none">  
  '''program''' Nastepna_permutacja(N,A);
  '''program''' Nastepna_permutacja(N,A);
  '''var''' i,k,pom: integer;
  '''var''' i,k,pom: integer;
  '''begin'''
  '''begin'''
i:=N-1;
  i:=N-1;
'''while''' i >= 1 '''do''' '''if''' A[i] > A[i+1] '''then''' i:=i-1;
  '''while''' i >= 1 '''do''' '''if''' A[i] > A[i+1] '''then''' i:=i-1;
'''if''' i >= 1 '''then''' '''begin'''
  '''if''' i >= 1 '''then''' '''begin'''
  k:=N;
    k:=N;
  '''while''' k >= i '''do''' '''if''' A[k] < A[i] '''then''' k:=k-1;
    '''while''' k >= i '''do''' '''if''' A[k] < A[i] '''then''' k:=k-1;
  pom:=A[i];
    pom:=A[i];
  A[i]:=A[k];
    A[i]:=A[k];
  A[k]:=pom;
    A[k]:=pom;
  Odwroc(A,i,N);
    Odwroc(A,i,N);
'''end''';
  '''end''';
  '''end'''.
  '''end'''.
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.
</div>
</div>
</div>
</div>
Linia 463: Linia 461:
== 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'''
<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''' Segment_o_danej_sumie(N,A,W);
  '''program''' Segment_o_danej_sumie(N,A,W);
Linia 470: Linia 468:
     istnieje: boolean;
     istnieje: boolean;
  '''begin'''
  '''begin'''
'''if''' W < 0 '''then''' istnieje:=false  
  '''if''' W < 0 '''then''' istnieje:=false  
'''else''' '''begin'''
  '''else''' '''begin'''
  p:=1; k:=1;
    p:=1; k:=1;
  suma:=A[1];
    suma:=A[1];
  '''while''' (suma <> W) '''and''' (k <= N) '''do'''
    '''while''' (suma <> W) '''and''' (k <= N) '''do'''
    '''if''' suma < W '''then''' '''begin'''
      '''if''' suma < W '''then''' '''begin'''
      k:=k+1;
        k:=k+1;
      suma:=suma+A[k];
        suma:=suma+A[k];
    '''end'''
      '''end'''
    '''else''' '''begin'''
      '''else''' '''begin'''
      p:=p+1;
        p:=p+1;
      suma:= suma-A[p];
        suma:= suma-A[p];
    '''end''';
      '''end''';
    istnieje:=(suma=W);
      istnieje:=(suma=W);
'''end''';
  '''end''';
  '''end'''.
  '''end'''.
</div>
</div>
Linia 490: Linia 488:


== Zadanie 12 (Głosowanie większościowe) ==
== 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
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.
tak wskazać go.
 
===Możliwe rozwiązania zadania ===
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1''' 
<div class="mw-collapsible-content" style="display:none">
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.
</div>
</div>
<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">
Linia 500: Linia 502:
  '''var''' i,j,ile,zwyciezca: integer;
  '''var''' i,j,ile,zwyciezca: integer;
  '''begin'''
  '''begin'''
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;
  '''if''' (ile > (N+1) div 2) '''then''' zwyciezca:=A[i];
    '''if''' (ile > (N+1) div 2) '''then''' zwyciezca:=A[i];
'''end''';
  '''end''';
  '''end'''.
  '''end'''.
</div>
</div>
Linia 512: Linia 514:


<div class="mw-collapsible mw-made=collapsible mw-collapsed">
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 2''' 
<div class="mw-collapsible-content" style="display:none">
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ł.
</div>
</div>
<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">
Linia 518: Linia 525:
  '''var''' ile,i,a,kand,zwyciezca: integer;
  '''var''' ile,i,a,kand,zwyciezca: integer;
  '''begin'''
  '''begin'''
kand:=1;  
  kand:=1;  
a:=A[1];
  a:=A[1];
ile := 1;
  ile := 1;
i := 1;
  i := 1;
'''while''' i < N '''do''' '''begin'''
  '''while''' i < N '''do''' '''begin'''
  i:= i+1;
    i:= i+1;
  '''if''' A[i]=a '''then''' ile:=ile+1
    '''if''' A[i]=a '''then''' ile:=ile+1
  '''else'''
    '''else'''
    '''if''' ile > 0 '''then''' ile:=ile-1
      '''if''' ile > 0 '''then''' ile:=ile-1
    '''else''' '''begin'''
      '''else''' '''begin'''
      a:=T[i];
        a:=T[i];
      ile:=1;
        ile:=1;
    '''end''';
      '''end''';
'''end''';
  '''end''';
ile:=0;
  ile:=0;
'''for''' i:=1 '''to''' '''do'''  
  '''for''' i:=1 '''to''' '''do'''  
  '''if''' A[i]=a '''then''' ile:=ile+1;  
    '''if''' A[i]=a '''then''' ile:=ile+1;  
'''if''' (ile > (N+1)div 2) '''then'''  
  '''if''' (ile > (N+1)div 2) '''then'''  
  zwyciezca:=a  
    zwyciezca:=a  
'''else''' zwyciezca:=0;
  '''else'''  
    zwyciezca:=0;
  '''end'''.
  '''end'''.
</div>
</div>
</div>
</div>


== Zadanie 13 (Arytmetyka liczb wielocyfrowych) ==
== Zadanie 13 (Arytmetyka liczb wielocyfrowych) ==
Linia 550: Linia 557:
* 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'''
<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">  
  '''const''' N=100;  
  '''const''' N=100;  
    b=10;  
  b=10;  
  '''type''' liczba = array[0..N-1] of integer;
  '''type''' liczba = array[0..N-1] of integer;
    dwa_liczba = array[0..2N-1] of integer;
  dwa_liczba = array[0..2N-1] of integer;
 
  '''procedure''' Suma(A,B:liczba, var C:liczba, var:przepelnienie:boolean);
  '''procedure''' Suma(A,B:liczba, var C:liczba, var:przepelnienie:boolean);
  '''var''' p: integer;
  '''var''' p: integer;
  '''begin'''
  '''begin'''
p:=0;
  p:=0;
'''for''' i:=0 '''to''' N-1 '''do''' '''begin'''
  '''for''' i:=0 '''to''' N-1 '''do''' '''begin'''
  C[i]:=A[i]+B[i];
    C[i]:=A[i]+B[i];
  '''if''' C[i] >= b '''then''' '''begin'''
    '''if''' C[i] >= b '''then''' '''begin'''
    C[i]:=C[i]-b;
      C[i]:=C[i]-b;
    p:=1;
      p:=1;
  '''end'''
    '''end'''
  '''else''' p:=0;
    '''else''' p:=0;
  '''end''';
  przepelnienie:=(p=1);
  '''end''';
  '''end''';
  przepelnienie:=(p=1);
   
'''end''';
 
  '''procedure''' Roznica(A,B:liczba, var C:liczba, var:ujemny:boolean);
  '''procedure''' Roznica(A,B:liczba, var C:liczba, var:ujemny:boolean);
  '''var''' p: integer;
  '''var''' p: integer;
  '''begin'''
  '''begin'''
p:=0;
  p:=0;
'''for''' i:=0 '''to''' N-1 '''do''' '''begin'''
  '''for''' i:=0 '''to''' N-1 '''do''' '''begin'''
  C[i]:=(A[i]-p)-B[i];
    C[i]:=(A[i]-p)-B[i];
  '''if''' C[i] < 0 '''then''' '''begin'''
    '''if''' C[i] < 0 '''then''' '''begin'''
    C[i]:=C[i]+b;
      C[i]:=C[i]+b;
    p:=1;
      p:=1;
  '''end'''
    '''end'''
  '''else''' p:=0;
    '''else''' p:=0;
'''end''';
  '''end''';
ujemny:=(p=1);
  ujemny:=(p=1);
  '''end''';
  '''end''';
 
  '''procedure''' Iloczyn(A,B:liczba, var C:dwa_liczba);
  '''procedure''' Iloczyn(A,B:liczba, var C:dwa_liczba);
  '''var''' p,i,j: integer;
  '''var''' p,i,j: integer;
  '''begin'''
  '''begin'''
p:=0;
  p:=0;
'''for''' i:=0 '''to''' 2N-1 '''do''' C[i]:=0;
  '''for''' i:=0 '''to''' 2*N-1 '''do''' C[i]:=0;
'''for''' i:=0 '''to''' N-1 '''do''' '''begin'''
  '''for''' i:=0 '''to''' N-1 '''do''' '''begin'''
  '''for''' j:=1 '''to''' N-1 '''do''' '''begin'''
    '''for''' j:=1 '''to''' N-1 '''do''' '''begin'''
    w:=A[i]*B[j]+p+C[i+j];
      w:=A[i]*B[j]+p+C[i+j];
    C[i+j]:=w mod b;
      C[i+j]:=w '''mod''' b;
    p:=w div b;
      p:=w '''div''' b;
    '''end''';
    C[i+n]:=p;
    p:=0;
   '''end''';
   '''end''';
  C[i+n]:=p;
  p:=0;
  '''end''';
  '''end''';
'''end''';
</div>
</div>
== Zadanie m ==
Napisz program
<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>
== Zadanie n ==
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">
'''Rozwiązanie 2'''
<div class="mw-collapsible-content" style="display:none">
'''program''' (N,A);
'''var''' : integer;
'''begin'''
  writeln('To jest rozwiązanie 2')
'''end'''.
</div>
</div>
</div>
</div>

Wersja z 12:24, 11 lip 2006

Ta strona zawiera podstawowe zadania na tablice. Ble ble

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.

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 = \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.

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