Wstęp do programowania / Ćwiczenia 3: Różnice pomiędzy wersjami
Zadania na wyszukiwanie binarne |
|||
Linia 1: | Linia 1: | ||
== 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 | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''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 ≤ 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. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''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> | |||
== Zadanie 6 (Pierwiastek z x)== | |||
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). | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
'''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 ≤ 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> | |||
== | == 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''' | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
''' | '''function''' Binpower(N,A,x):integer; | ||
'''var''' z,y,i: integer; | |||
'''var''' | |||
'''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