Ćwiczenia do Modułu 1: Różnice pomiędzy wersjami
Nie podano opisu zmian |
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:
- Operacja Kol jest bardzo kosztowna, więc zależy nam na tym by kolor każdego żetonu był sprawdzany co najwyżej raz.
- Robot potrafi zapamiętać tylko kilka wartości z przedziału 0..N+1.
- 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.