Информатикадан олимпиада есептерін шешу әдістері №9 лабораториялық жұмыс
Шешу әдістері бойынша топтастырылған есептер. Массивтердің қосымша «жалаушаларын» пайдалану
Олимпиадалық есептерді шешуді үйрену кезінде тапсырмаларды тақырыптар бойынша емес, оларды шешу әдістері бойынша топтасырудың маңызы орасан. Осындай топтастырулардың жиі қолданылатындарын қарастырайық. Бұл тақырыпта «жалаушаларды пайдалану» тәсілі қарастырылады.
Жұмыс мақсаты: қарастырылған әдістерді классикалық есептерді шешу үшін қолдануды үйрену.
Бір өлшемді массивтерге арналған кейбір есептерді шешу барысында белгілі бір шартты қанағаттандыратын элементтерді белгілеп қоюға тура келеді. Ол үшін Flag атты қосымша массивті қолданады. Егер бастапқы массивтің элементтері келтірілген шартты қанағаттандыратын болса, онда Flag массивінің сәйкес элементтері 1-лермен толтырылады.
Егер, бірнеше «жалауша» қолдану қажет болса, онда оларға түрлі мәнндер беру керек (мысалы: "1" және "-1" , т.с.с.).
1-мысал. Бүтін N-ге дейінгі барлық жай сандарды табу керек.
Қосымша мәліметтер: 1 .. N аралығындағы жай сандарды анықтау үшін "Эратосфен торы" әдісін пайдаланайық. Әдістің мазмұны мынадай:
1-қадам: "2" санын алып, сұр түске бояп қоямыз да, тізімдегі одан кейінгі 2-ге еселі сандардың барлығын сызып тастаймыз.
2-қадам: "2"-ден кейінгі алғашқы сызылмаған санды ("3") сұр түске бояймыз және одан кейінгі осы санға еселі сандардың барлығын сызып тастаймыз, т.с.с.
«Торда» сұр түспен боялған сандар ғана қалды. Олар – берілген аралықтағы жай сандар.
Сурет 6.1-«Эратосфен торы»
Шешу идеясы:
А массивін 1-ден N-ге дейінгі сандармен толтырамыз (мысалы, N=22 болсын)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Егер А массивінің элементтері 2-ге еселі болса, онда Flag массивінің сәйкес элементтерін «жалауша-бірлер»-мен толтырамыз (6.2-сурет):
Сурет 6.2-«Жалауша-бірлер»
Сонан соң А массивінің элементтері 3-ке еселі болса, онда Flag массивінің сәйкес элементтерін «жалауша-бірлер»-мен толтырамыз (6.3-сурет):
Сурет 6.3-«Жалауша-бірлер»
Дәл осылай соңына дейін жалғастырамыз.
«Тор»-да (А массивінде) сұр түспен боялған сандар қалды (6.4-сурет):
Сурет 6.4-«Тор»
Қадамдар санын азайту үшін А массивінің элементтерін жартысына дейін қарастырсақ, жеткілікті. Өйткені, (n санының ең үлкен бөлгіші - n/2 екені белгілі).
Паскальда:
Var a,flag:array [1..100] of integer;
I,j,n:integer;
begin
writeln ('n=');
readln (n);
for i:=1 to n do
a[i]:=i;
for i:=2 to n div 2 do
if flag[i]=0 then
for j:=i+1 to n do
if (a[j] mod a[i]=0) then flag[j]:=1;
for i:=1 to n do
if flag[i]=0 then write(a[i],' ');
end.
Тест:
Берілгені: |
100 |
Нәтиже: |
1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 97 |
2-мысал: Бүтін массив берілген. Ондағы әртүрлі элементтерінің санын анықтау керек.
Шешу идеясы: А массивінің әрбір элементін өзінен кейінгілерімен салыстыра отырып, ағымдық элементпен мәні тең элементке сәйкес Flag массивіндегі элементті «жалауша-бірлер»-мен толтырамыз. Flag массивіндегі нөлдік элементтер саны А массивіндегі әр түрлі элементтер санына тең болады.
Паскальда:
var a,flag: array [1..100] of integer;
i,j,n,k: integer;
begin
writeln ('n=');
readln (n);
for i:= 1 to n do
begin
writeln ('Маssivtin ',i,'-shi elementi:');
readln (a[i]);
end;
{==========================}
for i:=1 to n-1 do
if flag[i]=0 then
for j:=i+1 to n do
if a[i]=a[j] then flag[j]:=1;
for i:=1 to n do
if flag[i]=0 then k:=k+1;
writeln ('k=', k);
end.
Тест:
Берілгені: |
n=10 1, 4, 2, 2, 3, 1, 2, 3, 4, 1 |
Нәтиже: |
k=4 |
3-мысал: Массивтегі ең көп кездесетін элементті табу керек.
Шешу идея: А массивінің элементтерін салыстыру кезінде қайталанатындарын анықтаймыз. Flag массивінің элементтерін А массивіндегі қайталанулар санымен толтырамыз. Сосын, МАССИВТІҢ МАКСИМУМ ЭЛЕМЕНТІН ТАБУ алгоритмін пайдаланып, А массивіндегі ең жиі кездесетін элементтің позициясын анықтаймыз.
Паскальда:
var a,flag: array [1..100] of integer;
i,j,n,k,max,b: integer;
begin
writeln ('n=');
readln (n);
for i:= 1 to n do
begin
writeln (' a[',i,']=');
readln (a[i]);
end;
{===================}
k:=0;
for i:=1 to n-1 do
if flag[i]= 0 then
for j:=i+1 to n do
begin
if a[i]= a[j] then
begin
k:= k+1;
flag[j]:=k;
end;
k:=0;
end;
max:=flag[1];
for i:=1 to n do
if flag[i]>max then
begin
max:=flag[i];
b:=i;
end;
writeln ('En kop kezdesetin element: ', a[b]);
end.
Тест:
Берілгені: |
n=10 1, 4, 2, 2, 3, 1, 2, 3, 2, 1 |
Нәтиже: |
En kop kezdesetin element: 2 |
