Ćwiczenia do Modułu 1: Różnice pomiędzy wersjami
Poprawki po wizycie u Piotra |
Nie podano opisu zmian |
||
(Nie pokazano 11 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 28: | Linia 28: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' FlagaPolska1(N:integer; A:array[1..N] of integer); | '''program''' FlagaPolska1(N:integer; A:array[1..N] of integer); | ||
//Tablica A jest wypełniona zerami i jedynkami | |||
'''const''' bialy = 0; | '''const''' bialy = 0; | ||
czerwony = 1; | czerwony = 1; | ||
Linia 55: | Linia 56: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' FlagaPolska2(N:integer; A:array[1..N] of integer); | '''program''' FlagaPolska2(N:integer; A:array[1..N] of integer); | ||
//Tablica A jest wypełniona zerami i jedynkami | |||
'''const''' bialy = 0; | '''const''' bialy = 0; | ||
czerwony = 1; | czerwony = 1; | ||
Linia 87: | Linia 89: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' FlagaPolska3(N:integer; A:array[1..N] of integer); | '''program''' FlagaPolska3(N:integer; A:array[1..N] of integer); | ||
//Tablica A jest wypełniona zerami i jedynkami | |||
'''const''' bialy = 0; | '''const''' bialy = 0; | ||
czerwony = 1; | czerwony = 1; | ||
Linia 131: | Linia 134: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' FlagaPolska4(N:integer; A:array[1..N] of integer); | '''program''' FlagaPolska4(N:integer; A:array[1..N] of integer); | ||
//Tablica A jest wypełniona zerami i jedynkami | |||
'''const''' bialy = 0; | '''const''' bialy = 0; | ||
czerwony = 1; | czerwony = 1; | ||
Linia 175: | Linia 179: | ||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' FlagaTrójkolorowa(N:integer; A:array[1..N] of integer); | ||
'''var''' m,r,w,pom : integer; | '''var''' m,r,w,pom : integer; | ||
'''begin''' | '''begin''' | ||
Linia 200: | Linia 204: | ||
'''Rozwiązanie 2''' | '''Rozwiązanie 2''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' FlagaTrójkolorowa(N:integer; A:array[1..N] of integer); | ||
'''var''' m,r,w,pom : integer; | '''var''' m,r,w,pom : integer; | ||
'''begin''' | '''begin''' | ||
Linia 226: | Linia 230: | ||
== Zadanie 3 (Najdłuższe plateau) == | == Zadanie 3 (Najdłuższe plateau) == | ||
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > | Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, długość najdłuższego stałego segmentu (spójnego fragmentu tablicy). | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Wskazówka 1''' | '''Wskazówka 1''' | ||
Linia 236: | Linia 240: | ||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' NajdłuższePlateau1(N:integer; A:array[1..N] of integer); | ||
'''var''' l,p,w,maks: integer; | '''var''' l,p,w,maks: integer; | ||
'''begin''' | '''begin''' | ||
Linia 264: | Linia 268: | ||
'''Rozwiązanie 2''' | '''Rozwiązanie 2''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' NajdłuższePlateau2(N:integer; A:array[1..N] of integer); | ||
'''var''' w,p,dl,maks: integer; | '''var''' w,p,dl,maks: integer; | ||
'''begin''' | '''begin''' | ||
Linia 299: | Linia 303: | ||
'''Rozwiązanie 3''' | '''Rozwiązanie 3''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' NajdłuższePlateau3(N:integer; A:array[1..N] of integer); | ||
'''var''' i,maks: integer; | '''var''' i,maks: integer; | ||
'''begin''' | '''begin''' | ||
Linia 313: | Linia 317: | ||
== Zadanie 4 (Segment o maksymalnej sumie) == | == Zadanie 4 (Segment o maksymalnej sumie) == | ||
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > | Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, maksymalną sumę segmentu (spójnego fragmentu tablicy). Przyjmujemy, że segment pusty ma sumę 0. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Wskazówka 1''' | '''Wskazówka 1''' | ||
Linia 419: | Linia 423: | ||
'''end'''. | '''end'''. | ||
Ponieważ jest to rozwiązanie działające w czasie liniowym od N (p zwiększa się w każdym obrocie pętli) a wszystkich segmentów jest kwadratowo wiele, powstaje wątpliwość czy przypadkiem nie omijamy | Ponieważ jest to rozwiązanie działające w czasie liniowym od N (p zwiększa się w każdym obrocie pętli) a wszystkich segmentów jest kwadratowo wiele, powstaje wątpliwość czy przypadkiem nie omijamy | ||
segmentu a maksymalnej sumie. To trzeba by udowodnić. | segmentu a maksymalnej sumie. To trzeba by udowodnić. Temat ten będzie poruszany w module o niezmiennikach i logice Hoare'a. | ||
''Koszt czasowy'': liniowy względem N | ''Koszt czasowy'': liniowy względem N | ||
Linia 445: | Linia 449: | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadanie 5 (Część wspólna zbiorów) == | == Zadanie 5 (Część wspólna zbiorów) == | ||
Dane są dwie tablice A i B typu array[1..N] of integer, N > | Dane są dwie tablice A i B typu array[1..N] of integer, N > 0. Obie są | ||
posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu | posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu | ||
zbiorów wypisać (operacją write) cześć wspólną tych zbiorów. | zbiorów wypisać (operacją write) cześć wspólną tych zbiorów. | ||
Linia 457: | Linia 462: | ||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' CzęśćWspólna(N:integer; A,B:array[1..N] of integer); | ||
//Tablice A i B są posortowane rosnąco | |||
'''var''' ia,ib: integer; | '''var''' ia,ib: integer; | ||
'''begin''' | '''begin''' | ||
Linia 478: | Linia 484: | ||
== Zadanie 6 (Suma zbiorów) == | == Zadanie 6 (Suma zbiorów) == | ||
Dane są dwie tablice A i B typu array[1..N] of integer, N > | Dane są dwie tablice A i B typu array[1..N] of integer, N > 0. Obie są | ||
posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu | posortowane rosnąco. Należy traktując A i B jako reprezentacje dwu | ||
zbiorów wypisać (operacją write) sumę tych zbiorów. | zbiorów wypisać (operacją write) sumę tych zbiorów. | ||
Linia 490: | Linia 496: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Suma(N:integer; A,B:array[1..N] of integer); | '''program''' Suma(N:integer; A,B:array[1..N] of integer); | ||
//Tablice A i B są posortowane rosnąco | |||
'''var''' ia,ib: integer; | '''var''' ia,ib: integer; | ||
'''begin''' | '''begin''' | ||
Linia 531: | Linia 538: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Suma(N:integer; A,B:array[1..N] of integer); | '''program''' Suma(N:integer; A,B:array[1..N] of integer); | ||
//Tablice A i B są posortowane rosnąco | |||
'''var''' ia,ib: integer; | '''var''' ia,ib: integer; | ||
'''function''' mniejsze(ia,ib: integer):boolean; //funkcja porównująca wartości w ia i ib | '''function''' mniejsze(ia,ib: integer):boolean; //funkcja porównująca wartości w ia i ib | ||
Linia 565: | Linia 573: | ||
== Zadanie 7 (Podciąg) == | == 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 > | Dane są dwie tablice A typu array[1..N] of integer i B typu array[1..M] of integer, N, M > 0. 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)]). | ||
<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"> | '''Wskazówka 1''' <div class="mw-collapsible-content" style="display:none"> | ||
Linia 574: | Linia 582: | ||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' Podciąg(N,M:integer; A:array[1..N] of integer; B:array[1..M] of integer); | ||
'''var''' ia,ib: integer; | '''var''' ia,ib: integer; | ||
istnieje: boolean; | istnieje: boolean; | ||
Linia 674: | Linia 682: | ||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' Przesuń1(N,k:integer; A:array[1..N] of integer); | ||
'''var''' i: integer; | '''var''' i: integer; | ||
P: array[0..N-1] of integer; | P: array[0..N-1] of integer; | ||
Linia 695: | Linia 703: | ||
'''Rozwiązanie 2''' | '''Rozwiązanie 2''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' Przesuń2(N,k:integer; A:array[1..N] of integer); | ||
// k > 1 | |||
'''var''' dl_cyklu,ile_cykli: integer; | '''var''' dl_cyklu,ile_cykli: integer; | ||
'''begin''' | '''begin''' | ||
Linia 726: | Linia 735: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' Przesun3(N,k:integer; A:array[1..N] of integer); | '''program''' Przesun3(N,k:integer; A:array[1..N] of integer); | ||
// k > 1 | |||
'''begin''' | '''begin''' | ||
OdwracanieTablicy(A,0,N-k-1); | OdwracanieTablicy(A,0,N-k-1); | ||
Linia 731: | Linia 741: | ||
OdwracanieTablicy(A,0,N-1); | OdwracanieTablicy(A,0,N-1); | ||
'''end'''. | '''end'''. | ||
Procedura | Procedura OdwracanieTablicy pochodzi z Zadania 8. Poprawność tego rozwiązania można uzasadnić poniższym rysunekiem. W pierwszej linii jest aryginalna tablica, a w kolejnych tablica po kolejnych wywolaniach procedury OdwracanieTablicy. | ||
a(0) a(1) ... ... a(N-k-1) a(N-k) ... a(N-1) | a(0) a(1) ... ... a(N-k-1) a(N-k) ... a(N-1) | ||
a(N-k-1) a(N-k-2) ... ... a(0) a(N-k) ... a(N-1) | a(N-k-1) a(N-k-2) ... ... a(0) a(N-k) ... a(N-1) | ||
Linia 744: | Linia 754: | ||
== 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ą leksykograficznie [[permutację]]. Zakładamy, że permutacja w A nie jest ostatnia leksykograficznie. | Tablica A typu array[1..N] of integer, N > 0, 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. | ||
'''Przykład''' Dla N=3 kolejne permutacje w [[porządku leksykograficznym]] wyglądają nastepująco: | '''Przykład''' Dla N=3 kolejne permutacje w [[porządku leksykograficznym]] wyglądają nastepująco: | ||
Linia 762: | Linia 772: | ||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' NastępnaPermutacja(N:integer; A:array[1..N] of integer); | ||
//Permutacja zapisana w A nie jest ostatnia leksykograficznie | |||
'''var''' i,k,pom: integer; | '''var''' i,k,pom: integer; | ||
'''begin''' | '''begin''' | ||
Linia 786: | Linia 797: | ||
</div> | </div> | ||
== Zadanie 11 (Segment o | == Zadanie 11 (Segment o danej 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ą l, p takie, że W<math>=A[l]+...+A[p-1]</math>). | Tablica A typu array[1..N] of integer, N > 0, 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ą l, p takie, że W<math>=A[l]+...+A[p-1]</math>). | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
'''Wskazówka 1''' | '''Wskazówka 1''' | ||
Linia 799: | Linia 810: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' SegmentODanejSumie1(N,W:integer; A:array[1..N] of integer); | '''program''' SegmentODanejSumie1(N,W:integer; A:array[1..N] of integer); | ||
//Tablica A zawiera tylko liczby dodatnie | |||
'''var''' l,p,suma: integer; | '''var''' l,p,suma: integer; | ||
znalezione: boolean; | znalezione: boolean; | ||
Linia 835: | Linia 847: | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' SegmentODanejSumie2(N,W:integer; A:array[1..N] of integer); | '''program''' SegmentODanejSumie2(N,W:integer; A:array[1..N] of integer); | ||
//Tablica A zawiera tylko liczby dodatnie | |||
'''var''' l,p,suma: integer; | '''var''' l,p,suma: integer; | ||
znalezione: boolean; | znalezione: boolean; | ||
Linia 841: | Linia 854: | ||
'''else''' '''begin''' | '''else''' '''begin''' | ||
l:=1; p:=1; | l:=1; p:=1; | ||
suma:= | suma:=0; | ||
'''while''' (suma <> W) '''and''' (p <= N) '''do''' | '''while''' (suma <> W) '''and''' (p <= N) '''do''' | ||
'''if''' suma < W '''then''' '''begin''' //jeśli suma jest za mała to przesuwamy prawy koniec segmentu | '''if''' suma < W '''then''' '''begin''' //jeśli suma jest za mała to przesuwamy prawy koniec segmentu | ||
suma:=suma+A[p]; | |||
p:=p+1; | p:=p+1; | ||
'''end''' | '''end''' | ||
'''else''' '''begin''' //jeśli za duża to przesuwamy lewy koniec segmentu | '''else''' '''begin''' //jeśli za duża to przesuwamy lewy koniec segmentu | ||
suma:= suma-A[l]; | |||
l:=l+1; | l:=l+1; | ||
'''end'''; | '''end'''; | ||
znalezione:=(suma=W); | '''while''' (suma > W) '''do''' '''begin''' //jeśli suma nadal za duża to próbujemy ją zmniejszyć | ||
suma:= suma-A[l]; | |||
l:=l-1; | |||
'''end'''; | |||
znalezione:=(suma=W); | |||
'''end'''; //else | '''end'''; //else | ||
'''if''' znalezione '''then''' write('W tablicy A istnieje segment o sumie W); | '''if''' znalezione '''then''' write('W tablicy A istnieje segment o sumie W); | ||
'''end'''. | '''end'''. | ||
Ponieważ jest to rozwiązanie działające w czasie liniowym od N (l+p zwiększa się w każdym obrocie pętli) a wszystkich segmentów jest kwadratowo wiele, powstaje wątpliwość czy przypadkiem nie omijamy | Ponieważ jest to rozwiązanie działające w czasie liniowym od N (l+p zwiększa się w każdym obrocie pętli) a wszystkich segmentów jest kwadratowo wiele, powstaje wątpliwość czy przypadkiem nie omijamy | ||
segmentu a maksymalnej sumie. To trzeba by udowodnić. Wrócimy do tego problemu w | segmentu a maksymalnej sumie. To trzeba by udowodnić. Wrócimy do tego problemu w module o niezmiennikach i logice Hoare'a. | ||
''Koszt czasowy'': liniowy względem N | ''Koszt czasowy'': liniowy względem N | ||
Linia 865: | Linia 882: | ||
== 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 > | Dana jest tablica A typu array[1..N] of integer, N > 0. Sprawdzić czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak wskaż go. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
Linia 876: | Linia 893: | ||
'''Rozwiązanie 1''' | '''Rozwiązanie 1''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' Głosowanie1(N:integer; A:array[1..N] of integer); | ||
'''var''' i,j,ile,indeks_lidera: integer; | '''var''' i,j,ile,indeks_lidera: integer; | ||
'''begin''' | '''begin''' | ||
Linia 905: | Linia 922: | ||
'''Rozwiązanie 2''' | '''Rozwiązanie 2''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
'''program''' | '''program''' Głosowanie2(N,W:integer; A:array[1..N] of integer); | ||
'''var''' ile,i,kand,lider: integer; | '''var''' ile,i,kand,lider: integer; | ||
'''begin''' | '''begin''' | ||
Linia 919: | Linia 936: | ||
'''end'''; | '''end'''; | ||
'''end'''; | '''end'''; | ||
ile:=0; //sprawdzamy czy kandydat | ile:=0; //sprawdzamy czy kandydat jest liderem | ||
'''for''' i:=1 '''to''' '''do''' | '''for''' i:=1 '''to''' '''do''' | ||
'''if''' A[i]=kand '''then''' ile:=ile+1; | '''if''' A[i]=kand '''then''' ile:=ile+1; | ||
Linia 936: | Linia 953: | ||
== Zadanie 13 (Arytmetyka liczb wielocyfrowych) == | == 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: | Liczby wielocyfrowe będą reprezentowane w tablicach typu liczba=array[0..N-1] of integer, N > 1, 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. | # 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. | # 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. | ||
Linia 951: | Linia 968: | ||
Poniżej treści procedur Suma, Roznica, Iloczyn: | Poniżej treści procedur Suma, Roznica, Iloczyn: | ||
'''procedure''' Suma(A,B:liczba, var C:liczba, var: | '''procedure''' Suma(A,B:liczba, var C:liczba, var:przepełnienie:boolean); | ||
//Sumujemy liczby zapisane w A i B do C; zmienna przepełnienie staje się true gdy wynik nie mieści się w C. | |||
'''var''' p: integer; | '''var''' p: integer; | ||
'''begin''' | '''begin''' | ||
Linia 963: | Linia 981: | ||
'''else''' p:=0; | '''else''' p:=0; | ||
'''end'''; | '''end'''; | ||
przepełnienie:=(p=1); | |||
'''end'''; | '''end'''; | ||
''Koszt czasowy'': liniowy względem N | ''Koszt czasowy'': liniowy względem N | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
'''procedure''' | '''procedure''' Różnica(A,B:liczba, var C:liczba, var:ujemny:boolean); | ||
//Odejmujemy od liczby zapisanej w A liczbę z B. Wynik zapisujemy w C, zmienna ujemny informuje o znaku wyniku. | |||
'''var''' p: integer; | '''var''' p: integer; | ||
'''begin''' | '''begin''' | ||
Linia 986: | Linia 1005: | ||
''Koszt pamięciowy'': stały | ''Koszt pamięciowy'': stały | ||
'''procedure''' Iloczyn(A,B:liczba, var C:dwa_liczba); | '''procedure''' Iloczyn(A,B:liczba, var C:dwa_liczba); | ||
//Iloczyn liczb zapisanych w A i B zapisujemy w C. | |||
'''var''' p,i,j: integer; | '''var''' p,i,j: integer; | ||
'''begin''' | '''begin''' |
Aktualna wersja na dzień 13:02, 20 lip 2006
Ta strona zawiera podstawowe zadania na tablice.
Ogladaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
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). Podaj algorytm działania automatu przestawiającego żetony w urnach tak, by najpierw były żetony czerwone, potem białe. 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.
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Wskazówka 3
Rozwiązanie 3
Wskazówka 4
Rozwiązanie 4
Pytanko 1
Pytanko 2
Zadanie 2 (Flaga trójkolorowa)
Dana jest tablica A typu array[1..N] of integer (N > 0). Należy tak poprzestawiać w niej elementy, żeby najpierw były elementy ujemne, potem równe zero, a na końcu dodatnie.
Wskazówka 1
Rozwiązanie 1
Rozwiązanie 2
Zadanie 3 (Najdłuższe plateau)
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, długość najdłuższego stałego segmentu (spójnego fragmentu tablicy).
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Pytanko 1
Inna wersja zadania
A co było gdyby tablica była posortowana ?
Wskazówka 3
Rozwiązanie 3
Zadanie 4 (Segment o maksymalnej sumie)
Napisz program znajdujący w zadanej tablicy A typu array[1..N] of integer, N > 0, 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
Rozwiązanie 3
Rozwiązanie 4
Rozwiązanie 5
Zadanie 5 (Część wspólna zbiorów)
Dane są dwie tablice A i B typu array[1..N] of integer, N > 0. 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 > 0. 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
Pytanko 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 > 0. 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
Rozwiązanie 2
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, N > 0, 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.
Przykład Dla N=3 kolejne permutacje w porządku leksykograficznym wyglądają nastepująco:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
Wskazówka 1
Rozwiązanie 1
Zadanie 11 (Segment o danej sumie)
Tablica A typu array[1..N] of integer, N > 0, 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ą l, p takie, że W).
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Zadanie 12 (Głosowanie większościowe)
Dana jest tablica A typu array[1..N] of integer, N > 0. Sprawdzić czy jest w niej element wystepujący więcej niż N/2 razy i jeśli tak wskaż 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, N > 1, 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