Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
InfOlimp_9-lab.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
226.82 Кб
Скачать

Информатикадан олимпиада есептерін шешу әдістері №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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]