Wstęp do programowania / Ćwiczenia 3: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Daria (dyskusja | edycje)
Zadania na wyszukiwanie binarne
Linia 1: Linia 1:
Ta strona będzie zawierać podstawowe zadania na tablice.  
== Zadanie 1 (Pierwsze wystąpienie x)==
Dana jest posortowana niemalejąco tablica A typu array[1..N] of integer i x typu integer. Znajdź
miejsce pierwszego wystąpienia x (lub 0 gdy nie ma żadnego x)


== Zadanie 1 (Flaga polska)==
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
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:
'''Rozwiązanie 1''' 
<div class="mw-collapsible-content" style="display:none">
'''function''' Znajdz_Pierwsze(N,A,x):integer;
'''var''' l,p,s : integer;
'''begin'''
  l:=1;
  p:=N;
  '''while''' l < p '''do''' '''begin'''
    s:=(l+p)div 2;
    '''if''' A[s] < x '''then''' l:=s+1;
    '''else''' p:=s;
  '''end''';
  '''if''' A[l] = x '''then''' Znajdz_Pierwsze:=l
  '''else''' Znajdz_Pierwsze:=0;
'''end''';
</div>
</div>
== Zadanie 2 (Ostatnie wystąpienie x)==
Dana jest posortowana niemalejąco tablica A typu array[1..N] of integer i x typu integer. Znajdź
miejsce ostatniego wystąpienia x (lub 0 gdy nie ma żadnego x)
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1''' 
<div class="mw-collapsible-content" style="display:none">
'''function''' Znajdz_Ostatnie(N,A,x):integer;
'''var''' l,p,s : integer;
'''begin'''
  l:=1;
  p:=N;
  '''while''' l < p '''do''' '''begin'''
    s:=(l+p+1)div 2;
    '''if''' A[s] > x '''then''' p:=s-1;
    '''else''' l:=s;
  '''end''';
  '''if''' A[l] = x '''then''' Znajdz_Ostatnie:=l
  '''else''' Znajdz_Ostatnie:=0;
'''end''';
</div>
</div>
 
== Zadanie 3 (Policz liczbę wystapień x)==
Dana jest posortowana niemalejąco tablica A typu array[1..N] of integer i x typu integer. Policz ile razy występuje w niej wartość x.
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1''' 
<div class="mw-collapsible-content" style="display:none">Trzeba użyc wyszukiwania binarnego a nie liniowego.
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1''' 
<div class="mw-collapsible-content" style="display:none">
'''function''' Liczba_wystapien(N,A,x):integer;
'''var''' p,l: integer;
'''begin'''
  l:= Znajdz_Pierwsze(N,A,x);
  p:= Znajdz_Pierwsze(N,A,x);
  '''if''' l <> 0 '''then''' Liczba_wystapien:=p-l+1;
'''end''';
</div>
</div>
 
== Zadanie 4 (Wartość równa indeksowi)==
Dana jest posortowana rosnąco tablica A typu array[1..N] of integer.  Sprawdź czy występuje w niej element o wartości równej swojemu indeksowi. Jeśli tak to zwróć ten indeks, jeśli nie to zwróć 0;
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 1''' 
<div class="mw-collapsible-content" style="display:none">Jeśli A[i] < i to też A[i-1] < i-1. I podobnie dla i-2, i-3...1. 
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1''' 
<div class="mw-collapsible-content" style="display:none">
'''function''' Rowny(N,A):integer;
'''var''' p,l,s: integer;
'''begin'''
  '''if''' (A[1] > 1) or (A[N] < N) '''then''' Rowny:=0
  '''else''' '''begin'''
    l:=1;
    p:=N;
    '''while''' l < p '''do''' '''begin'''
      s:=(l+p)div 2;
      '''if''' A[s] < s '''then''' l:=s+1;
      '''else''' p:=s;
    '''end''';
    Rowny:=(A[l]=l);
  '''end'''; 
'''end''';
Dla tablic posortowanych niemalejąco to rozwiązanie nie działa.
</div>
</div>
 
== Zadanie 5 (Maksimum w ciągu bitonicznym)==
Dana jest tablica A typu array[1..N] of integer, w której wartości ułożone są w ciąg bitoniczny (czyli istnieje 1 &le; i &le; N, takie że dla wszystkich k < i zachodzi A[k] < A[k+1] a dla wszystkich k &ge; i  zachodzi A[k] > A[k+1]). Znajdź maksimum w tym ciągu.


*Kol(i) - podaje kolor żetonu w i-tej urnie (1 &le; i &le; n)
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
*Z(i,j) - zamienia żetony z i-tej i j-tej urny (1 &le; i,j &le; n)
'''Wskazówka 1''' 
<div class="mw-collapsible-content" style="display:none">Szukamy pierwszego elementu dla którego A[i] > A[i+1]. Trzeba uważać na przypadek gdy maksimum jest w A[N].
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1''' 
<div class="mw-collapsible-content" style="display:none">
'''function''' Maks_bitoniczny(N,A):integer;
'''var''' p,l,s: integer;
'''begin'''
  '''if''' N=1 '''then''' Maks_bitoniczny:=1
  '''else'''
    '''if''' A[N-1] < A[N] '''then''' Maks_bitoniczny:=N
    '''else''' '''begin'''
      l:=1;
      p:=N-1;
      '''while''' l < p '''do''' '''begin'''
        s:=(l+p)div 2;
        '''if''' A[s] < A[s+1] '''then''' l:=s+1;
        '''else''' p:=s;
      '''end''';
      Maks_bitoniczny:=l;
    '''end'''; 
'''end''';
</div>
</div>


Uwagi:  
== Zadanie 6 (Pierwiastek z x)==
#Operacja Kol jest bardzo kosztowna, więc zależy nam na tym by kolor każdego żetonu był sprawdzany co najwyżej raz.   
Napisz program obliczający sufit z pierwiastka z x, dla x<math>\in</math>R, x > 0. (Oczywiście bez operacji pierwiastek; za to dostępna jest funkcja Sufit).
#Robot potrafi zapamiętać tylko kilka wartości z przedziału 0..N+1.
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
#Nie można założyć, że występuje choć jeden żeton w każdym z kolorów.
'''Wskazówka 1''' 
<div class="mw-collapsible-content" style="display:none">Najprostsze rozwiązanie jest liniowe.
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 1''' 
<div class="mw-collapsible-content" style="display:none">
  '''function''' SufitPierwiastka1(x:Real):integer;
'''var''' i: integer;
'''begin'''
  i:=1;
  '''while''' i*i < x '''do''' i := i+1;
  SufitPierwiastka1 := i;
'''end''';
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Wskazówka 2''' 
<div class="mw-collapsible-content" style="display:none">Oczywiście lepiej jest to zrobic binarnie. Szukamy takiej liczby całkowitej i z przedziału [1..Sufit(x)], że (i-1)*(i-1) < x &le;  i*i.  
</div>
</div>
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
'''Rozwiązanie 2''' 
<div class="mw-collapsible-content" style="display:none">
'''function''' SufitPierwiastka2(x:Real):integer;
'''var''' l,p,s : integer;
'''begin'''
  l:=1;
  p:=Sufit(x);
  '''while''' l < p '''do''' '''begin'''
    s:=(l+p)div 2;
    '''if''' s*s < x '''then''' l:=s+1;
    '''else''' p:=s;
  '''end''';
  SufitPierwiastka2:=l;
'''end''';
</div>
</div>


===Możliwe rozwiązania zadania 1===  
== Zadanie 7 (Binpower)==
Dla zadanego x<math>\in</math>R i n<math>\in</math>N policz x^n (oczywiscie bez exp i ln).
<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);
  '''function''' Binpower(N,A,x):integer;
'''const''' bialy = 0;
  '''var''' z,y,i: integer;
      czerwony = 1;
  '''var''' b,c : integer;
  '''begin'''
  '''begin'''
  '''end'''.
  z:=1;
  y:=x;
  i:=n;
  '''while''' i > 0 '''do''' '''begin'''
    '''if''' (i mod 2 = 1) '''then''' z:=z*y;
    y:=y*y;
    i:=i div 2;
  '''end''';
  Binpower:=z;
  '''end''';
</div>
</div>
</div>
</div>

Wersja z 11:01, 11 lip 2006

Zadanie 1 (Pierwsze wystąpienie x)

Dana jest posortowana niemalejąco tablica A typu array[1..N] of integer i x typu integer. Znajdź miejsce pierwszego wystąpienia x (lub 0 gdy nie ma żadnego x)

Rozwiązanie 1

Zadanie 2 (Ostatnie wystąpienie x)

Dana jest posortowana niemalejąco tablica A typu array[1..N] of integer i x typu integer. Znajdź miejsce ostatniego wystąpienia x (lub 0 gdy nie ma żadnego x)

Rozwiązanie 1

Zadanie 3 (Policz liczbę wystapień x)

Dana jest posortowana niemalejąco tablica A typu array[1..N] of integer i x typu integer. Policz ile razy występuje w niej wartość x.

Wskazówka 1

Rozwiązanie 1

Zadanie 4 (Wartość równa indeksowi)

Dana jest posortowana rosnąco tablica A typu array[1..N] of integer. Sprawdź czy występuje w niej element o wartości równej swojemu indeksowi. Jeśli tak to zwróć ten indeks, jeśli nie to zwróć 0;

Wskazówka 1

Rozwiązanie 1

Zadanie 5 (Maksimum w ciągu bitonicznym)

Dana jest tablica A typu array[1..N] of integer, w której wartości ułożone są w ciąg bitoniczny (czyli istnieje 1 ≤ i ≤ N, takie że dla wszystkich k < i zachodzi A[k] < A[k+1] a dla wszystkich k ≥ i zachodzi A[k] > A[k+1]). Znajdź maksimum w tym ciągu.

Wskazówka 1

Rozwiązanie 1

Zadanie 6 (Pierwiastek z x)

Napisz program obliczający sufit z pierwiastka z x, dla xR, x > 0. (Oczywiście bez operacji pierwiastek; za to dostępna jest funkcja Sufit).

Wskazówka 1

Rozwiązanie 1

Wskazówka 2

Rozwiązanie 2

Zadanie 7 (Binpower)

Dla zadanego xR i nN policz x^n (oczywiscie bez exp i ln).

Rozwiązanie 1