М И Н И СТ Е РСТ В О О Б РА ЗО В А Н И Я РО ССИ Й СК О Й Ф Е Д Е РА Ц И И В О РО Н Е Ж СК И Й ГО СУ Д А РСТ В Е Н Н ЫЙ У Н И В Е РСИ Т Е Т
О .Ф .У скова О .Д .Гор бенко А .И .Ш аш кин
О ЛИ М П И А Д Н ЫЕ ЗА Д А ЧИ П О П РО Г РА М М И РО В А Н И Ю . ЛУ ЧШ И Е РЕ Ш Е Н И Я Часть2
У чебное издание
В О РО Н Е Ж – 2001
Б Б К 32.97 У Д К 681.3 О ли м п и ад н ы е зад ачи п о п рограм м и рован и ю . Л у чш и е ре ш е н и я. В тре х частях. Часть 2.: У че бн ое и зд ан и е / О .Ф .У скова, О .Д .Горбе н к о, А.И.Ш аш ки н – В орон е ж: О О О ПФ «Д жу д и », 2001 – 44 с.
Работа вы п олн е н а в рам ках Ф е д е ральн ой це ле вой п рограм м ы «Ин те граци я» п о н ап равле н и ю «В оссозд ан и е сту д е н че ск и х н ау чн ы х ш к ол и оли м п и ад » (п рое к тР0054). Изд ае тся п ри фи н ан совойп од д е ржке О О О ПФ «Д жу д и ».
Б Б К 32.97 У Д К 681.3 ISBN 5-815-047-0 © В орон е жск и й у н и ве рси те т © Ф е д е ральн ая це ле вая п рограм м а «Ин те граци я» © О .Ф .У ск ова, О .Д .Горбе н ко, А.И.Ш аш к и н © О О О ПФ «Д жу д и »
О ГЛ А В Л Е Н И Е Пре д и слови е . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1. О бщ ая и н форм аци я о ш коле -оли м п и ад е . . . . . . . . . . . . . . . . . . . . . . . . . .4 2. Зад ачи ск ом м е н тари ям и и ре ш е н и ям и . . . . . . . . . . . . . . . . . . . . . . . . . . .
П Р Е Д И СЛО В И Е И з д ание п од г от овле но в рам ках п рое кт а Р 0054 Ц е ле вой Ф е д е ральной п рог рам м ы
"И нт е г рация"
по
нап равле нию
"Воссоз д ание
ст уд е нч е ских
науч ны х ш кол и олимп иад ". Оно орие нт ировано в основном на уч аст ников р егио н а л ь н о й
о т кр ы т о й
ст уден ческо й
ш ко л ы -о л им пиа ды
пр о гр а м м ир о ва н ию и ко м пь ю т е р н о м у м о дел ир о ва н ию , но м оже т т акже
по бы т ь
п оле з но ш кольникам ст арш их классов, ст уд е нт ам и уч ит е лям
информат ики общ е образ оват е льны х и п рофильны х уч е бны х з аве д е ний . О рг аниз ат орам и
ш колы -олимп иад ы
являют ся
Вороне жский
г осуниве рсит е т , Вы ч ислит е льны й Ц е нт р Р оссий ской Акад е м ии Наук (РАН) и Вороне жский г осуд арст ве нны й п е д аг ог ич е ский униве рсит е т . В п е рвой ч аст и рассм ат ривались з ад ач и п ре д ш е ст вовавш их олимп иад п о информат ике раз лич ног о уровня (факульт е т ских, вуз овских, м е жвуз овских, ре г иональны х, фе д е ральны х). Не кот оры е з ад ач и п риве д е ны с ре ш е ниям и, в
основном
раз работ анны ми
ст уд е нт ам и
факульт е т а
п риклад ной
м ат е м ат ики и м е ханики Вороне жског о униве рсит е т а, ст авш им и в свое вре мя п риз е рам и эт их олим п иад . Во вт орой
ч аст и п ом им о з ад ач ,
п ре д ложе нны х на олим п иад ах раз лич ног о уровня, п ре д ст авле ны м ат е риалы п е рвог о (з аоч ног о) т ура ш колы -олим п иад ы . Вороне жский
униве рсит е т , на баз е
кот орог о п ровод ит ся ш кола-
олим п иад а, вы ражае т п риз нат е льност ь О О О ПФ "Джуд и" (д ире кт ор Анд ре й .Василье вич Анд ре й ч иков), оказ авш е м у се рье з ную п од д е ржку в из д ании эт ой книг и.
1. О Б Щ А Я И Н Ф О РМ А Ц И Я О Ш К О ЛЕ -О ЛИ М П И А Д Е П О ЛО Ж Е Н И Е О П Е РВ О М Т У РЕ Пе рвы й ту р ш колы -оли м п и ад ы состои тся 17 се н тября 2001 год а. Е го п ре д у см отре н о п рове сти в те ле к ом м у н и каци он н ом ре жи м е . Е сли ву з н е п од клю че н к Ин те рн е ту , то п олу чи тьзад ан и я м ожн о од н и м и з сп особов: 1. Л и чн о яви ться в О ргком и те т ш к олы -оли м п и ад ы ком н .8)
(У н и ве рси те тск ая п л., 1,
2. О брати ться в бли жайш и й Ин те рн е т-салон (н ап ри м е р, н а главн ы е п очтовы е отд е ле н и я) 3. При слать заявк у н а вы д ачу зад ан и я п о эле к трон н ой п очте
[email protected] .
п о ад ре су
Ф и ли алы у н и ве рси те та (Л и ски , В е рхн и й М ам он , С тары й О скол) п олу чат зад ан и я че ре з п ре д стави те ле й у н и ве рси те та н а м е стах, в свои ху че бн ы х отд е лах. Н а п е рвом ту ре бу д у т п ре д ложе н ы 2 зад ачи : п е рвая - общ ая, вторая у чи ты ваю щ ая сп е ци альн ость у частн и к ов оли м п и ад ы . К рассм отре н и ю п ри н и м аю тся работы , в которы х ре ш е н а хотя бы од н а зад ача. О ргком и те т п ре д у п ре жд ае т, что совп ад аю щ и е д ру г с д ру гом с точн остью д о ле ксе м ы п рограм м ы рассм атри ваться н е бу д у т. Ре ш е н и я д олжн ы бы ть вы слан ы п о эле ктрон н ой п очте п о ад ре су
[email protected] , ли бо п ре д ставле н ы ли чн о в О ргком и те т ш колы -оли м п и ад ы (У н и ве рси те тская п л., 1, к ом н .8) д о 17 часов 19 се н тября 2001 год а. В сам ом н ачале п рограм м ы в каче стве ввод н ого ком м е н тари я н е обход и м о у казать сле д у ю щ и е све д е н и я: - фам и ли ю , и м я, отче ство автора (п олн остью ); - п ре д ставляе м ы й ву з; - ад ре сву за;
- факу льте т; - сп е ци альн ость(сп е ци али заци ю ); - форм а обу че н и я (ве че рн яя, заочн ая); - фам и ли ю , и м я, отче ство и у че н ое зван и е д е кан а факу льте та ; - фам и ли ю , и м я, отче ство и у че н ое зван и е п ре п од авате ля, которого автор счи тае тсвои м тре н е ром (е сли такойе сть); - д ом аш н и й ад ре савтора п рограм м ы ; - e-mail, URL, ICQ. О ргк ом и те тбу д е трассм атри ватьработы тольк о сту д е н тов ву зов. В п е рвом ту ре у стан авле н ы сле д у ю щ и е н ом и н аци и д ля у частн и ков: - сту д е н ты 1 к у рса (н е зави си м о отсп е ци альн ости ); - сту д е н ты , д ля которы х и н форм ати ка являе тся п рофи ли ру ю щ е й д и сци п ли н ой (сп е ци альн ости - п ри клад н ая м ате м ати ка, м ате м ати ка, м е хан и ка, фи зи ка, ком п ью те рн ы е н ау ки , С А ПР, и н форм ати ка, вы чи сли те льн ы е си сте м ы , си сте м н ое п рограм м и рован и е , эк он ом и ка, эк он ом и че ск ая ки бе рн е ти ка, и н форм аци он н ы е си сте м ы , и н форм аци он н ая бе зоп асн ость) ; сту д е н ты , д ля которы х и н форм ати ка являе тся общ е образовате льн ой д и сци п ли н ой; - сту д е н ты гу м ан и тарн ы х сп е ци альн осте й; - сту д е н ты , сп е ци али зи ру ю щ и е ся в области и ску сства, к у льту ры , сп орта. По же лан и ю сту д е н ты 1 ку рса м огу т п е ре йти в н ом и н аци ю , отве чаю щ у ю и х сп е ци альн ости . ЗА Д А Н И Я
1 Т У РА
З ад ач а (общ ая д ля все х н ом и н аци й) Н а острове BORLAND кажд ы й и з е го жи те ле й орган и зовал п арти ю , котору ю сам и возглави л. В кажд ой п арти и – н е м е н е е д ву х че лове к. По К он сти ту ци и острова в п арлам е н т д олжн ы войти главы все х п арти й, н о фи н ан совы е тру д н ости н е п озволяю т это сд е лать. Н а ре фе ре н д у м е гражд ан е острова ре ш и ли , что к ажд у ю п арти ю в п арлам е н те д остаточн о п ре д ставлять од н и м чле н ом п арти и . Т ре бу е тся сформ и ровать п арлам е н т как м ожн о м е н ьш е й чи сле н н ости , в котором бы ли бы п ре д ставле н ы все п арти и . Т е хн и че ски е тре бован и я. В се главы п арти й(и п арти и ) п е ре н у м е рован ы от1 д о N (4<=N<=150). В ход н ы е д ан н ы е . Пе рвая строк а вход н ого те кстового файла input.txt сод е ржи т N - чи сло п арти й, в кажд ой и з п осле д у ю щ и х строк п е ре чи сляю тся че ре з п робе л п оряд ковы е н ом е ра гражд ан – чле н ов соотве тству ю щ е й п арти и .
В ы ход н ы е д ан н ы е . В ы ход н ой те кстовы й файл output.txt сод е ржи т п оряд ковы е н ом е ра глав п арти й, вош е д ш и х в п арлам е н т. При м е р Input.txt N
4
output.txt 2
1
2 3 4
2
3
3
1 4 2
4
2 Задачи п о ном инация м Н ом и н аци я «Ф и зк у льту ра и сп орт»
В че м п и он ате ре ги он а п о фу тболу у частву е т 10 ком ан д . В табли це че м п и он ата зан е се н ы ре зу льтаты встре ч к ом ан д д ру г с д ру гом . В слу чае вы и гры ш а к ом ан д а п олу чае т 2 очк а, в слу чае н и чье й – 1 очко, в слу чае п рои гры ш а – 0 очков. Т ре бу е тся разработатьалгори тм (п рограм м у ) д ля: - п острое н и я табли цы че м п и он ата п о д ан н ы м , ввод и м ы м ск лави ату ры ; - вы вод а этой табли цы (н а экран и ли бу м агу ) ; - оп ре д е ле н и я н азван и й к ом ан д , зан явш и х п осле д н и е три м е ста в че м п и он ате ; - оп ре д е ле н и я п е рвойп о сп и ск у и з ком ан д , н е и м е вш и х н и од н ой н и чье й; - оп ре д е ле н и я к ом ан д ы -че м п и он а. Н ом инация «И скусство» В кон к у рсе п и ан и стов вы сту п ле н и я у частн и ков оце н и вае т жю ри , в состав которого вход ят ш е сть м у зы кан тов. М акси м альн ая оце н к а, котору ю м оже т вы стави ть кажд ы й чле н жю ри , 10 баллов, м и н и м альн ая – н оль. Т ре бу е тся разработатьалгори тм (п рограм м у ) д ля - п острое н и я ли н е йн ой табли цы , сод е ржащ е й фам и ли и и и н и ци алы у частн и ков, и п рям оу гольн ой табли цы , сод е ржащ е й оце н к и к ажд ого чле н а жю ри ; - оп ре д е ле н и я фам и ли и у частн и к а – п обе д и те ля кон ку рса; - н ом е р сам ого строгого чле н а жю ри .
Н ом инация «П ер вокур сники» Н а К ом п ью те рн ой у ли це жи ву т в собстве н н ы х д ом ах тольк о се м ьи Паск алё вы х и С и п лю сп лю совы х. О н и ре ш и ли п е ре се ли ться так, чтобы все Паск алё вы жи ли в н ачале у ли цы , а все С и п лю сп лю совы - в кон це . Изве стн о общ е е коли че ство д ом ов н а у ли це и кто жи ве тв к ажд ом д ом е . Разработайте м од е ль и составьте алгори тм (п рограм м у ) п е ре се ле н и я, п ри у слови и , что к ажд ая се м ья д олжн а п е ре е зжать н е боле е од н ого раза, а в кажд ом обм е н е д олжн ы у частвоватьтолько д ве се м ьи . Н ом инация «И нф ор м атика, как общ еобр азовательная дисц ип лина» Н а Ю жн ом п олю се расп оложе н ы N п рон у м е рован н ы х м е те oрологи че ск и х стан ци й. К ажд ая стан ци я сое д и н е н а с д ру ги м и стан ци ям и ли н и ям и связи . В ре зу льтате сти хи йн ого бе д стви я н е которы е ли н и и связи оказали сь н ару ш е н н ы м и . Исп равн ость ли н и и связи м е жд у I-той и K-той стан ци ям и оп ре д е ляе тся и з це лочи сле н н ой табли цы NET: эле м е н т с и н д е ксам и (I,K) раве н 1, е сли связь м е жд у I-той и K-той стан ци ям и н е н ару ш е н а, и 0 - в п роти вн ом слу чае . Т ре бу е тся оп ре д е ли ть, м е жд у как и м и п арам и стан ци й связьн е возм ожн а д аже че ре з це п очки д ру ги х стан ци й. С озд ать м од е ль се ти стан ци й и разработать п рограм м у д ля оп ре д е ле н и я п ар стан ци й, м е жд у которы м н е возм ожн о у стан ови тьсвязь. Т е хн и че ски е тре бован и я В ход н ы м и д ан н ы м и являю тся чи сло стан ци й N табли ца NET разм е ром NxN.
и
це лочи сле н н ая
В ход н ы е д ан н ы е бе ру тся и з те кстового файла INPUT.TXT (е го п ре д вари те льн о н у жн о созд ать), в п е рвой строк е к оторого у к азы вае тся чи сло стан ци й, в кажд ой сле д у ю щ е й строке - оче ре д н ая строка табли цы . Ре зу льтаты п ары н ом е ров стан ци й - вы вод ятся п острочн о н а экран . Н ом инация «И нф ор м атикакак п р оф илир ую щ ая дисцип л ина» Т ре бу е тся см од е ли роватьразм е щ е н и е Т файлов н а д и ске тах так, чтобы чи сло д и ске т бы ло м и н и м альн ы м , п ри у слови и , что разм е р кажд ого файла н е п ре вы ш ае те м кости д и ске ты , и файлы н е льзя разби ватьн а части . Т е хн и че ски е тре бован и я. В ход н ы м и д ан н ы м и являю тся чи сло файлов Т и це лочи сле н н ая табли ца FILES, сод е ржащ ая разм е ры файлов. Е м кость д и ск е ты счи тае тся и зве стн ой и равн а 1,44 М б. В ход н ы е д ан н ы е бе ру тся и з те к стового файла INPUT.TXT (е го п ре д вари те льн о н у жн о созд ать), в п е рвой строк е к оторого у к азы вае тся чи сло файлов, в сле д у ю щ е й строке - строка табли цы . Ре зу льтаты – чи сло д и ске т и н ом е ра файлов н а к ажд ой и з д и ске т- вы вод ятся п острочн о н а экран .
Н ом инация «Студенты г ум анитар ны х сп ец иальностей» Т ре бу е тся н айти и вы ве сти н а экран все слова зад ан н ого те к ста, коре н ь которы х ввод и тся с клави ату ры . Т е кст п ре д ставляе т собой п осле д овате льн ость слов, разд е ле н н ы х лю бы м чи слом п робе лов. Т ре бу е тся п острои ть м од е ль, алгори тм и п рограм м у ре ш е н и я п оставле н н ой зад ачи .
О ргком и т ет О т кр ы т ой реги ональной ст уденческой ш колы -оли м п и ады п о п рограм м и р ов ани ю и ком п ью т ерном у м одели р ов ани ю (П рези дент ская целев ая п р ограм м а "И нт еграци я", раздел 1.6, п роект Р0054) Пре д се д ате ль оргком и те та -
ЗА ПРЯГАЕ В С е рге й А ле ксан д рови ч, Пе рвы й п роре ктор В орон е жского госу н и ве рси те та, д октор фи зи к о-м ате м ати че ски х н ау к, п рофе ссор
Зам . Ш А Ш К ИН А ле ксан д р Иван ови ч, д е кан факу льте та ПМ М , Пре д се д ате ля - д октор фи зи к о-м ате м ати че ски х н ау к , п рофе ссор. Чле н ы оргком и те та:
М ИХ А Й Л О В Гу ри й М и хайлови ч, зам . д и ре ктора В ы чи сли те льн ого це н тра РА Н , кан д и д атфи зи ком ате м ати че ски х н ау к , г.М осква Ш А К ИН В се волод В лад и м и рови ч, зав. се к тором В ы чи сли те льн ого це н тра РА Н , кан д и д атфи зи ком ате м ати че ски х н ау к , г.М осква С У РО В Ц Е В ИгорьС те п ан ови ч, н ачальн и к у п равле н и я п рофе сси он альн ого образован и я и н ау к и Главн ого у п равле н и я образован и я ад м и н и страци и В орон е жской области , д октор те хн и че ск и х н ау к, п рофе ссор У С К О В А О льга Ф е д оровн а, д оце н ткафе д ры м ате м ати че ского обе сп е че н и я Э В М В ГУ , к ан д и д атте хн и че ск и х н ау к , коорд и н атор п рое кта ГО РБ Е Н К О О ле г Д ан и лови ч, зав.кафе д рой м ате м ати че ского обе сп е че н и я Э В М В ГУ , к ан д и д атфи зи ко-м ате м ати че ски х н ау к ПО Т А ПО В Але ксан д р С е рге е ви ч, п роре ктор В орон е жского госп е д у н и ве рси те та, п рофе ссор А Н Т ИПО В С е рге й Ан атолье ви ч, ре ктор В орон е жск ого областн ого и н сти ту та п овы ш е н и я квали фи каци и и п е ре п од готовк и работн и к ов образован и я, д октор фи зи к ом ате м ати че ски х н ау к , п рофе ссор Ф Е Д О Т О В В лад и м и р Иван ови ч, д е к ан ге ографи че ского
факу льте та В ГУ , д ок тор ге ографи че ск и х н ау к , п рофе ссор К О С Т ИН В лад и м и р А ле к се е ви ч, д е кан м ате м ати че ск ого факу льте та В ГУ , д ок тор фи зи ко-м ате м ати че ски х н ау к , п рофе ссор К АЗА К О В В и тали й Гри горье ви ч, д и ре ктор С тарооскольского фи ли ала В ГУ , кан д и д атп е д агоги че ски х н ау к Л А ПЫ ГИН Д м и три й Ру д ольфови ч, зам . ге н е ральн ого д и ре ктора ЗАО "РЕ Т ", г.В орон е ж Б А Ш К ИН В и к тор Н ау м ови ч, п ре д се д ате льС ове та д и ре к торов ЗАО Т орговы й д ом "Ф и н и ст", г.В орон е ж ПЕ РЕ Л Ы ГИН А Зоя Н е сте ровн а, зав. лаборатори е й вы чи сли те льн ой те хн и к и В ГУ Ч Е РН Ы Х Н и н а Пе тровн а, кан д и д атфи зи ко-м ате м ати че ски х н ау к, ру ковод и те льре ги он альн ого це н тра фи рм ы «М и рраЛ ю кс» К РАС Н Е Р Илья Н ау м ови ч, д и ре к тор Ц е н тра п равовой и н форм ати ки М и н и сте рства ю сти ци и РФ п о В орон е жской области Секрет ар и ат оли м п и ады К РО В ЯК О В А В але н ти н а Але к се е вн а, лаборан тк афе д ры М М ИО Т Ю Н ИН А Л и д и я Н и колае вн а, и н же н е р Л В Т М Е Н Ь Ш ИК О В А О льга Иван овн а, се кре тарьд е кан ата факу льте та ПМ М Ст уденчески й ди рект орат ЯК У Б Е Н К О Ад ре й, м аги стран т1 год а обу че н и я В А Х Т ИН А ле к се й, м аги стран т2 год а обу че н и я ПО Л ЯК О В А н д ре й, м аги стран т1 год а обу че н и я Е Ф РЕ М О В М акси м , м аги стран т1 год а обу че н и я М Х ИТ А РЯН Л у си н е , м аги стран т1 год а обу че н и я РО М А Щ Е Н К О Але ксе й, м аги стран т1 год а обу че н и я
Ж ю ри О т кр ы т ой реги ональной ст уденческой ш колы -оли м п и ады п о п р ограм м и ров ани ю и ком п ью т ерном у м одели ров ани ю
Пре д се д ате ль ГО РБ Е Н К О О ле г Д ан и лови ч, зав. к афе д рой м ате м ати че ского жю ри обе сп е че н и я Э В М В ГУ , кан д и д атфи зи к о-м ате м ати че ски х н ау к Зам .п ре д се д атУ С К О В А О льга Ф е д оровн а, д оце н ткафе д ры м ате м ати че ского е ля обе сп е че н и я Э В М В ГУ , кан д и д атте хн и че ски х н ау к Чле н ы жю ри :
М ИЛ О В С К А Я Л ю д м и ла С е рафи м овн а, д оце н ткафе д ры и н форм ати к и В ГПУ , кан д и д атфи зи к о-м ате м ати че ски х н ау к К У Л А ПИН Л е он и д Ге н ри хови ч, д и ре ктор це н тра ИН Т Е РН Е Т , к ан д и д атфи зи ко-м ате м ати че ски х н ау к В О РО Н ИН А Ири н а Е вге н ье вн а, зам . д и ре ктора н ау чн ом е тод и че ского це н тра п о ком п ью те рн ой ли н гви сти ке , к ан д и д ат те хн и че ск и х н ау к, д оце н т М Е Л Ь Н ИК О В В ад и м М и трофан ови ч, п ре п од авате лькафе д ры м ате м ати че ск ого обе сп е че н и я Э В М ; С Е Л Е З Н Е В К он стан ти н Е горови ч, п ре п од авате лькафе д ры м ате м ати че ск ого обе сп е че н и я Э В М ; АЗ Н А У РЬЯН Ц А ле ксан д р В лад и м и рови ч, ге н е ральн ы й д и ре ктор Ц е н тральн о-Че рн озе м н ого п ре д стави те льства корп ораци и "ПАРУ С ", г.В орон е ж
Cп онсор ы откр ы тойр ег иональнойстуденческойш колы -олим п иады п о п р ог р ам м ир ованию и ком п ью тер ном у м оделир ованию Ад м и н и страци я В орон е жск ой области Ц е н тральн о-Че рн озе м н ое п ре д стави те льство к орп ораци и "ПА РУ С ", г.В орон е ж (Ру ковод и те ль- А.В .Азн ау рьян ц) ЗАО "РЕ Т ", г.В орон е ж (Ге н е ральн ы й д и ре ктор В .М .К олы хали н ) ЗАО ПК Ф "В орон е жски йк е рам и че ски й завод " (ге н е ральн ы й д и ре ктор Горе м ы ки н В .А .) Т орговы й д ом "Ф и н и ст", г.В орон е ж ( Пре д се д ате льсове та д и ре кторов В .Н .Б аш ки н ) К осм е ти че ск ая фи рм а NINELLE, Исп ан и я (Б ре н д -м е н е д же р ком п ан и и п о Ц ЧЭ Р Г.Иван ова) ЗАО "РЕ Л Э К С ", г.В орон е ж (Ге н е ральн ы й д и ре к тор И.А.Б ойче н к о) ЗАО Н Э К С , г.В орон е ж (Ге н е ральн ы й д и ре ктор Г.В .Пон ом аре в) Ф он д С .Г.К ре йн а
О скольски й эле к тро-м е таллу рги че ск и й ком би н атБ е лгород ской области Ф и ли алГу та-бан ка в г.С т.О ск олБ е лгород скойобласти Росси йская Ассоци аци я "Ж е н щ и н ы в н ау к е и образован и и " ( Пре зи д е н т Ассоци аци и п рофе ссор М ГУ Г.Ю .Ри зн и че н ко) Росси йская Ассоци аци я "Ж е н щ и н ы -м ате м ати к и " (Пре зи д е н тАссоци аци и д оце н тВ ГУ И.С .Гу д ови ч) К он д и те рская фабри к а "С лавян к а" г. С т. О ск олБ е лгород ской области (Д и ре к тор С .А.Гу се в) Ре ги он альн ы й це н тр фи рм ы «М и рра-Л ю к с»(Ру ковод и те льН .П.Че рн ы х) ЗАО "К е д р+" , г.В орон е ж. (Д и ре ктор Ю .П.Л и строва, к ан д . фи зи ком ате м ати че ски х н ау к , д оце н т) О О О ПФ "Д жу д и " (Д и ре ктор А.В .А н д ре йчи ков) С тарооскольск и й те хн ологи че ски йи н сти ту т(фи ли ал М ИС и С ) К ом п ан и я "Ин форм связь-Че рн озе м ье " (Д и ре ктор Б .И.Д ан ьш и н ) О О О Ин те ркон (Ру ковод и те льА.В .О си п ов) Ф и н ан совая гру п п а "С п асск и е ворота", фи ли алв г.В орон е же К ом п ан и я "Oriflaime" (Ш ве ци я) Ф и рм а "К ом п ью те рн ы е те хн ологи и "(ру к овод и те льИ.И.О ку н е в)
И нф ор мационная п оддер ж каоткр ы тойр ег иональной студенческойш колы -олимп иады п о п р ог р аммир ованию и комп ью тер ному моделир ованию В орон е жское госу д арстве н н ое рад и о Газе та "Изве сти я" (Ре ги он альн ы й вы п у ск) О бщ е стве н н о-п оли ти че ски й е же н е д е льн и к "Д он ъ" "Газе та су ли цы Л и зю кова" Газе та "М олод ой ком м у н ар" Газе та "В орон е жск и й у н и ве рси те т" Газе та "К ом п ью те рн ое чти во" Газе та «Ф ак у льте тПМ М » О О О ПФ "Д жу д и " Газе та "К ом п ью те рра" Резуль таты 1 тур аоткр ы тойр ег иональ нойстуденческойш колы -олим п иады п о п р ог р амм ир ованию иком п ь ю тер ном у моделир ованию
Сп исок п р ош едш их во 2 тур п о О СН О В Н О Й ном инации 1 Аброси м ов Але ксан д р Иван ови ч В ГУ ПМ М 2 Б е лоброд ски й Ан д ре й Ан д ре е ви ч В ГУ Э кон ом . 3 Б е лоу сова Ю ли я В лад и м и ровн а В И М В Д РТФ 4 В ахти н С е рге й А ле ксан д рови ч В ГУ Ге ол. 5 В орон и н а Татьян а В ГУ ПМ М 6 В ы ростков Д м и три й Ан д ре е ви ч В ГУ ПМ М 7 Гаш ков М ак си м Але ксан д рови ч В ГПУ Ф ИЗ М АТ 8 Глад ы ш е в О ле г В и кторови ч В ГУ ПМ М 9 Гром ов С тан и слав Ан д ре е ви ч В ГУ ПМ М 10 Д е сятов Але ксе й Д м и три е ви ч В И М В Д РТФ 11 Д ом бровск ая О льга В але рье вн а В ГУ Ге ол. 12 З атворн и цк и й Але к сан д р Пе трови ч В ГТ А АТ П 13 Иван н и ков М акси м Игоре ви ч В ГТ У Ф АЭ М 14 Иван ов Ан д ре й В аси лье ви ч В ГПУ Ф ИЗ М АТ 15 К ад и м ов О ле г Н ари м ан ови ч В ГУ ПМ М 16 К арп ю к Д м и три й Але к сан д рови ч В В А И 17 К атов М и хаи лВ и кторови ч В ГУ Ф и з. 18 К ли н ски х А н тон Але ксан д рови ч В ГУ ПМ М 19 К озлов Ю ри й С тан и славови ч В И М В Д РТФ 20 К олбе ш ки н Д м и три й М и хайлови ч В ГУ ПМ М 21 К ом ова А н н а Ан атолье вн а В ГУ Ге ол. 22 К у ри н М и хаи лС е рге е ви ч В ГТ А АТ П 23 К у роп атк и н Ан д ре й С е рге е ви ч В ГПУ фи з.-м ат. 24 Л е сн и ков Д м и три й В яче славови ч В ГАС У Д орС ТР 25 М и н аков С е рге й В ГУ ПМ М 26 М у хое д ов Д м и три й С е рге е ви ч В ГУ ПМ М 27 Н е красов С тан и слав Ю рье ви ч В ГУ ПМ М 28 Н ови к ов Але ксан д р В аси лье ви ч В ГУ ПМ М 29 О к у н е в А ле к сан д р Иван ови ч В ГУ Ю РФ АК 30 Пе ров С е рге й Н и к олае ви ч В ГТ А Те хн М яса 31 Пле ш кова О ксан а Игоре вн а В ГУ Ге о. 32 Проси н С е рге й Але к сан д рови ч В ГУ ПМ М 33 Ры ш ков Е вге н и й В але ри е ви ч В ГАС У М е хАвтоД ор 34 С аве лье в К он стан ти н Э д у ард ови ч В ГПУ Ф ИЗ 35 Х ау стов Д м и три йВ аси лье ви ч В ИРЭ В Б С С 36 Чу лю ков Але к се й В лад и м и рови ч В ГУ ПМ М 37 Ш и ряе в М и хаи лМ и хайлови ч В ГУ ПМ М 38 Як у н и н М акси м С е рге е ви ч В ГПУ фи з.-м ат. Сп исок п р ош едш их во 2 тур п о ном инации "П Е РВ О К У РСН И К И " 1. Ан д ре йчи ков В аси ли й А н д ре е ви ч, В ГУ , ПМ М 2 Архи п ова Ири н а Н и колае вн а В ГУ Х и м . 3 Б е зрод н ы й Але ксе й Н и к олае ви ч В ИРЭ РЭ Б С 4 В ощ и н ск ая Е ле н а С е рге е вн а В ГУ РГФ 5 Глу хов Арте м Л е он и д ови ч В ГУ ПМ М 6 Род и он ов Д м и три й Але ксан д рови ч В ГУ Э К О Н О М 7 Д е сятов Ан д ре й Д м и три е ви ч В ГУ Ф К Н 8 Д у раков Ром ан Але к сан д рови ч В ГПУ Ф ИЗ М АТ
9 К оле сн и к Арте м В але рье ви ч В ГТА Ф АТ П 10 К оржов Н и колай Е вге н ье ви ч В ГУ ПМ М 11 Л ари н ИгорьАле к сан д рови ч В ГУ ПМ М 12 Л огу н ов С е рге й Иван ови ч В ГУ м ат. 13 Л у чки н А ле к се й Ю рье ви ч В ГУ м ат. 14 Пи саре вски й С е рге й Ю рье ви ч В ГТ У В М 15 С и д оре н к о С тан и слав В лад ле н ови ч В ГУ ПМ М 16 Х лоп к ов Ан д ре й В ГУ ПМ М Сп исок п р ош едш их во 2 тур п о ном инации "И Н О ГО РО Д Н И Е У ЧА СТ Н И К И " 1 Б абе н ко Ан тон Пе трови ч Л и ск и н си й ф-лВ ГУ 2 Б у рн ае в К он стан ти н Е вге н ье ви ч Б е лгород ск и йГТАС М А Пи ИТ 3 В озн ю к Д м и три й Л е он и д ови ч Л и ски н си й ф-лВ ГУ 4 Гри д н е в Але ксан д р Н и к олае ви ч С т. О скольски й ф-лВ ГУ ПМ М 2 Заколод яжн ы й Ю ри й В и к торови ч С т. О скольски й ф-лВ ГУ ПМ М 3 Иван ов О ле г О ле гови ч Л и п е цк и й ГТУ Ф А ИИ 4 Исае ва Татьян а М и хайловн а Б е лгород ски йГТАС М А Пи ИТ 5 К озлова О льга В и к торовн а С т.О ск ольски й ф-лМ ИС и С 6 К оле сн и ков М акси м Але к сан д рови ч С т.О скольск и й ф-лМ ИС и С ИТ 7 К орн и е н ко С тан и слав Альбе ртови ч Л и п е цки йГТУ Ф А И 8 М авле тк у лов Ан д ре й Л е он и д ови ч Л и п е цки й ГТУ Ф А ИИ 9 М алаш е н к о А.П. С т.О ск ольски й ф-лМ ИС и С 10 М и хали н Ром ан В але рье ви ч Л и ски н си й ф-лВ ГУ 11 Н е у м ы ваки н С е рге й С е рге е ви ч Л и ск и н си й ф-лВ ГУ 12 С е м е ри н С е рге й Павлови ч Б е лгород ск и йГТА С М А Пи ИТ 13 С у ве йкэ Е вге н и й Ге орги е ви ч С т.О ск ольски й ф-лМ ИС и С 14 Т и щ е н к о Иван С т.О скольск и й ф-лМ ИС и С
2. ЗА Д А ЧИ СК О М М Е Н Т А РИ Я М И И Р Е Ш Е Н И Я М И З а да чи 1 - 3 п р едла г а лис ь на с т уденчес кой олим п иа де с т удент ов 1 кур с а фа культ ет а ПММ п о инфор м а т икев 1997 г оду. Задача1. " О бход ш ахматнойдоски ходом коня " Создать программу, в соответствии с которой шахматный конь мог бы обойти всю доску, побывав на каждом поле всего один раз. Приводится решение одного из победителей олимпиады, ныне студентки 4 курса факультета ПММ Сигаевой Олеси Васильевны. program knight; const n=8; {размер доски} nn=64;{ число полей nn=n*n} type doska=array[1..n,1..n] of 0..nn; var dos:doska; x,y:integer;{координаты поля} exist:boolean;{существует ли решение} cx,cy:array[1..8] of integer; {заполняем массивы cx и cy} procedure cxcy; begin cx[1]:=2; cy[1]:=1;
cx[2]:=1; cx[3]:=-1; cx[4]:=-2; cx[5]:=-2; cx[6]:=-1; cx[7]:=1; cx[8]:=2; end; {cxcy} procedure xod (var
cy[2]:=2; cy[3]:=2; cy[4]:=1; cy[5]:=-1; cy[6]:=-2; cy[7]:=-2; cy[8]:=-1;
dos:doska; x,y, {положение коня} i:integer;{номер хода} var exist:boolean); var k,{номер варианта} u,v:integer;{новое положение коня} begin k:=0; repeat k:=k+1; u:=x+cx[k]; v:=y+cy[k]; if (u>=1) and (u<=n) and (v>=1) and (v<=n) then {не вышли за пределы доски} if dos[u,v]=0 then begin dos[u,v]:=i; if i
Задача2. " Считалка" Создать программу для печати номеров детей в том порядке, в котором они выходят из круга согласно детской считалочке. Приводится
решение одного из победителей олимпиады, ныне студентки 4 курса факультета ПММ Польшаковой Натальи Викторовны} program children; const nmax=20; {максимальное число игроков} var n, {фактическое число играков} m, {число слов в считалке} i,j:integer; round: set of 1..nmax; begin read(n,m); round:=[1..n]; {в круге стоят n детей} i:=n; repeat for j:=1 to m do repeat i:=i mod n+1; until i in round; write(i:3); round:=round-[i] until round=[] end. Задача 3.
" Ферзь "
Требуется расставить на шахматной доске восемь ферзей так, чтобы они не угрожали друг другу, т.е. никакие две фигуры не стоят ни на одной горизонтали, ни на одной вертикали, ни на одной диагонали. Приводится решение одного из победителей олимпиады, ныне студентки 4 курса факультета ПММ Шаховой Натальи} program FERSI; const n=8; {размер доски} type board=array [1..n,1..n] of boolean; var doc:board; exist:boolean; x,y:integer; {---------- Функция, проверяющая расстановку ферзей на поле (x,y)---------} function may (var doc:board; x,y:integer):boolean; var i,j:integer; zan:boolean; begin {may} i:=x; zan:=false; { просмотр вертикали } while (i>1) and not zan do begin i:=i-1; zan:=doc[i,y] end; i:=x; j:=y; { просмотр левой диагонали } while (i>1) and (j>1) and not zan do begin i:=i-1; j:=j-1; zan:=doc[i,j] end; i:=x; j:=y; { просмотр правой диагонали }
while (i>1) and (j
for y:=1 to n do doc[x,y]:=false; exist:=false; put(doc,1,exist); print(doc) end.
Задача4. "К р олики" Задача предлагалась на областной олимпиаде школьников в 2000 году и на факультетской олимпиаде в 2001 году. Поступила партия из 2n кроликов k пород. Кроликов рассадить в n двухместных клеток так, чтобы получилось как можно больше однопородных брачных пар, а разнопородных брачных пар не было. Автор решения – один из победителей олимпиады, студент 3 курса ф-та ПММ ВГУ Алексей Владимирович Чулюков. var fkr:text; s1:word; procedure input;{Ввод кроликов} var krol:string[2];n:longint; begin assign(fkr,'input.txt'); rewrite(fkr); writeln('Введите данные типа mk или fk, k=0..9 - номер породы; Enter - конец'); n:=1; repeat write('Кролик ',n,':> '); readln(krol); writeln(fkr,krol); inc(n) until krol=''; close(fkr) end; procedure married(var s:word);{Рассадка кроликов} var mkr:array['0'..'9'] of longint;krol:string[2];i:char; begin assign(fkr,'input.txt'); reset(fkr); s:=0; for i:='0' to '9' do mkr[i]:=0; while not eof(fkr) do begin readln(fkr,krol); case krol[1] of 'm': begin if mkr[krol[2]]<0 then begin inc(s); inc(mkr[krol[2]]) end else inc(mkr[krol[2]]) end; 'f': begin if mkr[krol[2]]>0 then begin inc(s);
dec(mkr[krol[2]]) end else dec(mkr[krol[2]]) end end end; close(fkr) end; procedure output(s1:word);{Вывод кроликов} var marr:string[5]; begin assign(fkr,'output.txt'); rewrite(fkr);str(s1,marr);write(marr); writeln(fkr,marr); close(fkr) end; begin input; married(s1); output(s1) end.
Задача5. "Divide et impkra!" Задача предлагалась на областной олимпиаде школьников в 1998 году и на факультетской олимпиаде в 1999 году. Автор решения – один из победителей олимпиады, ныне магистрант второго года обучения Вахтин Алексей Александрович. Н а п лоск ости зад ан о N п рям ы х. Н ап и ш и те п рограм м у д ля оп ре д е ле н и я, н а ск ольк о часте й разби ваю тп лоскостьэти п рям ы е . Те хн и че ски е тре бован и я: В ход н ой файл: INPUT.TXT В ы ход н ой файл: OUTPUT.TXT О гран и че н и е вре м е н и : 20 се к у н д . Ф орм атвход н ы х д ан н ы х: Исход н ы е д ан н ы е во вход н ом файле зап и сан ы в сле д у ю щ е м п оряд к е : N, a1, b1, c 1, d1,… , a N, bN, cN , d N, гд е 1<=N<=100, а п ары чи се л(ai,bi) и (ci,di) – це лочи сле н н ы е к оорд и н аты д ву х разли чн ы х точе к , че ре з к оторы е п роход и т п рям ая сн ом е ром i. В се д ан н ы е разд е ляю тся п робе лам и и /и ли си м волам и п е ре вод а строк и . Ф орм атвы ход н ы х д ан н ы х: В вы ход н ой файлн е обход и м о вы ве сти од н о це лое чи сло – и ском ое к оли че ство к у ск ов. При м е р вход н ы х и вы ход н ы х д ан н ы х INPUT.TXT OUTPUT.TXT 3 7 0002 02202000 Алгори тм : К оли че ство часте й, н а к оторы е д е лятли н и и п лоскость, зави си тотчи сла н е совп ад аю щ и х ли н и и и чи сла п е ре се че н и йк ажд ой ли н и и . С н ачала отброси м все совп ад аю щ и е ли н и и и н айд е м все точки п е ре се че н и й. Пу сть н е совп ад аю щ и х ли н и й k. Тогд а м и н и м альн ое чи сло часте й k+1 (ли н и и п аралле льн ы ). В озьм е м п е рву ю точк у п е ре се че н и й. Пу стьв н е й п е ре се кае тся n1 ли н и й. Тогд а к к оли че ству часте й (k+1) п ри бавляе тся n1-1 часте й. В озьм е м втору ю точк у п е ре се че н и й. Пу сть в н е й п е ре се к ае тся n2 ли н и й. Тогд а к коли че ству часте й п ри бавляе тся е щ е n2-1, и так д але е , п робе гая все точк и п е ре се че н и й, п олу чи м коли че ство часте й, н а которы е д е лятли н и и п лоск ость.
Програм м а: {Автор: В ахти н А. А.} program CrossLine; Type TPoint=Record X,Y: Real; End; {М асси в точе к , зад аю щ и х ли н и и . М ак си м альн ое чи сло ли н и й 100} TLines=Array [1..100,1..2] of TPoint; {М асси в точе к п е ре се че н и й ли н и й. М ак си м альн ое чи сло точе к п е ре се че н и й 4950 (п о к ом би н атори ке )} TPoints=Array [1..4950] of TPoint; Var
F: Text; p: TPoint; Lines: TLines; Points: TPoints; n,k,i,j: Integer; Count: Integer; pcount: Integer; x1,y1,x2,y2: Integer;
Function Cross(x11,y11,x21,y21,x12,y12,x22,y22: Real): Boolean; Var a1,b1,c1: Real; a2,b2,c2: Real; p: TPoint; i: Integer; Be gin Cross:=true; {Зад аю тся п арам е тры п рям ы х (ay+bx=c} a1:=x21-x11; b1:=y11-y21; c1:=a1*y11+b1*x11; a2:=x22-x12; b2:=y12-y22; c2:=a2*y12+b2*x12; {Е сли ли н и и совп ад аю т} If (a1*b2-a2*b1=0) and (a1*b2=a2*b1) and (b1*c2=b2*c1) and (a1*c2=a2*c1) then Cross:=false; {Е сли ли н и и п е ре се к аю тся} If a1*b2-a2*b1<>0 then Begin {Ищ е тся точка п е ре се че н и й} p.x:=(a1*c2-a2*c1)/(a1*b2-a2*b1); p.y:=(b2*c1-b1*c2)/(a1*b2-a2*b1); i:=1; {Парове рка н али чи я точки п е ре се че н и й в м асси ве . Е сли н е т- д обавляе тся} While (i<=pcount) and ((p.x<>Points[i].x) or (p.y<>Points[i].y)) do i:=i+1; If (pcount=0) or (i>pcount) then Begin Inc(pcount); Points[pcount]:=p; End; End; end;{Cross}
Begin {ввод д ан н ы х. О тбросточе к и совп ад аю щ и х ли н и й. В ы чи сле н и е точе к п е ре се че н и й} Assign(F,'input.txt'); Reset(F); Read(F,n); k:=1; pcount:=0; For i:=1 to n do If i<>1 then begin Read(F,x1,y1,x2,y2); j:=1; While (j<=k) and (abs(x1-x2)+abs(y1-y2)<>0) and cross(x1,y1,x2,y2, Lines[j,1].X,Lines[j,1].Y,Lines[j,2].X,Lines[j,2].Y) do j:=j+1; If j>k then Begin k:=k+1; Lines[k,1].X:=x1; Lines[k,1].Y:=y1; Lines[k,2].X:=x2; Lines[k,2].Y:=y2; End; End else Read(F,Lines[k,1].X,Lines[k,1].Y,Lines[k,2].X,Lines[k,2].Y); Close(F); {Под сче тчасте й} Count:=k+1; For i:=1 to pcount do Begin n:=0; For j:=1 to k do If (Points[i].x-Lines[j,1].x)*(Lines[j,2].y-Lines[j,1].y)= (Points[i].y-Lines[j,1].y)*(Lines[j,2].x-Lines[j,1].x) then n:=n+1; If n<>0 then Count:=Count+n-1; End; {В ы вод ре зу льтата } Assign(F,'output.txt'); Rewrite(F); Write(F,Count); Close(F); End. Задача6. " Я зы к TURBU " Задача была предложена на областной олимпиаде школьников в 2000 году и на межвузовской студенческой олимпиаде в 2001 году. Автор решения – один из победителей олимпиады, ныне магистрант первого года обучения Ромащенко Алексей Геннадьевич. В языке TURBU алфавит содержит 5 букв: "#", "$", "&","*","@". Все используемые в языке слова - пятибуквенные, поэтому в словаре языка TURBU первое слово - #####, последнее - @@@@@. На каждой странице словаря напечатано N слов. Определить: 1. Количество страниц Р, необходимое для размещения всех слов языка TURBU в словаре. 2. Номер Q страницы, на которой располагается задаваемое слово а. 3. Слова, которыми начинается и заканчивается страница, содержащая задаваемое слово b языка TURBU.
Технические требования. Входные данные. Входной текстовый файл input.txt содержит: в первой строке - число N, во второй - слово а, в третьей - слово b. Выходные данные. Выходной текстовый файл output.txt должен содержать: в первой строке - число страниц Р; во второй строке - номер Q страницы, содержащей слово а; в третьей строке - первое слово на странице, содержащей слово b; в четвертой строке - последнее слово на странице, содержащей слово b. Пример. input.txt N a b
35 ####$ ###$$
output.txt P Q
90 1 ##### ##$$@
Алгоритм решения задачи основан на переводе чисел из пятеричной системы счисления в дестичную и обратно. Каждое слова языка Turbu представляет собой число в пятеричной системе счисления, если принять : # за 0 $ за 1 & за 2 * за 3 @ за 4 Полученое число в пятеричной системе счисления переводится в соответствующее число в десятичной системе счисления и уже с ним производятся необходимые действия для получения требуемых результатов. При вычислниях в десятичной системе получается число, соответствующее слову в языке TURBU. Это число переводится в соответствующее число в пятеричной системе и, следовательно, известно написание искомого слова. В языкеTURBU всего 3125 слов. Program TURBU;{автор Ромащенко А.Г.} Type num5=string; var a,b:num5; n:integer; p:integer; Function To5(x:integer):num5; {перевод числа в слово из языка TURBU} var s:num5; r:string; k:integer; begin s:=''; While x>0 do begin k:=x mod 5; x:=x div 5; case k of 0:r:='#'; 1:r:='$'; 2:r:='&';
3:r:='*'; 4:r:='@'; else Writeln('Error!!!!!') end; s:=r+s; end; To5:=s; end; Procedure ReadFile; {чтение исходных данных из файла Input.txt: N - число слов на странице a - первое слово b - второе слово } var s:string; f:text; begin Assign(f,'input.txt'); Reset(f); Readln(f,n); Readln(f,a); Readln(f,b); Close(f); end; Function To10(x:string):integer; {перевод слова языка TURBU в число от 0 до 3124 каждый символ в языке TURBU представляет собой цифру пятеричной системы счисления от 0 до 4} var i,pos,st,r:integer; begin pos:=0; st:=1; for i:=length(x) downto 1 do begin case x[i] of '#':r:=0; '$':r:=1; '&':r:=2; '*':r:=3; '@':r:=4; else Writeln('Error!!!!!') end; pos:=pos+r*st; st:=st*5; end; To10:=pos; end; Procedure DoLen5(var s:string); {дополнение полученного слова до принятого в языке TURBU (необходимо когда в начале слова стоит один(или несколько) нулевой символ `#`, в этом случае код слова в десятичной системе счисления будет меньше 625)} begin While length(s)<5 do s:='#'+s; end; Procedure WriteToFile; {запись в файл Output.txt и расчет выходных данных} var ttt,q,p:integer; s1,s2:num5;
f:text; begin Assign(f,'output.txt'); Rewrite(f); {расчет необходимого количества страниц} p:=Trunc(3125/n+0.999999); Writeln(f,p); {расчет номера страницы, на которой находиться слово a} q:=To10(a) div n + 1; Writeln(f,q); {получение первого слова на странице, на которой находиться слово b} ttt:=(To10(b) div n)*n; s1:=To5(ttt); {добавление в начало полученного слова нулевых символов языка TURBU} DoLen5(s1); Writeln(f,s1); {получение последнего слова на странице, на которой находиться слово b} ttt:=(To10(b) div n)*n+n-1; if ttt>3124 then ttt:=3124; s2:=To5(ttt); {добавление в начало полученного слова нулевых символов языка TURBU} DoLen5(s2); Writeln(f,s2); Close(f); end; {основная программа} BEGIN ReadFile; WriteToFile; END. Задача7. " М осковскоеврем я " Задача была предложена на всемирной студенческой олимпиаде по программированию (ACM) в 1999 году. Автор решения – один из участников четвертьфинального тура олимпиады, неоднократный победитель межвузовских олимпиад, ныне магистрант 1 года обучения факультета ПММ ВГУ Якубенко Андрей Павлович. Задано время в определенном часовом поясе. Требуется определить время, которое сейчас в Москве(GMT +0300). Запись +0300 означает, что время в данном часовом поясе отличается от времени по Гринвичу на +03 часа 00 минут. формат входных данных: файл input.txt: SUN, 03 DEC 1996 09:10:35 +0100 формат выходных даных: файл output.txt: SUN, 03 DEC 1996 11:10:35 +0300
Program Moscow; Const DayMonth:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31); {сколько дней в каком месяце} var day,date,month,year,hour,min,sec:integer; {считанные день, число, месяц, год, час, минуты, секунды} inch,incmin:integer; {указывает считанный часовой пояс} f:text; {указатель на файл для чтения и записи} Procedure GetNext(s:string;var i:integer;var r:string); {выделяет слово из строки} begin r:=''; while (i<=length(s)) and (s[i] in [' ', ',' , ':' ]) do inc(i); while (i<=length(s)) and not (s[i] in [' ', ',' , ':' ]) do begin r:=r+s[i]; inc(i); end; end; Procedure ReadF; {считывает файл input.txt} var s,r:string; {переменные для хранения всей строки и 1 слова} i:integer; {указатель на тек. позицию} err:integer; {признак ошибки при распознавании чисел(не проверяется)} begin Assign(f,'input.txt'); Reset(f); i:=1; Read(f,s); GetNext(s,i,r); if r='MON' THEN DAY:=1; if r='TUE' THEN DAY:=2; if r='WED' THEN DAY:=3; if r='THU' THEN DAY:=4; if r='FRI' THEN DAY:=5; if r='SAT' THEN DAY:=6; if r='SUN' THEN DAY:=7; GetNext(s,i,r); Val(r,date,err); GetNext(s,i,r); if r='JAN' THEN if r='FEB' THEN if r='MAR' THEN if r='APR' THEN if r='MAY' THEN if r='JUN' THEN if r='JUL' THEN if r='AUG' THEN if r='SEP' THEN if r='OCT' THEN if r='NOV' THEN if r='DEC' THEN
MONTH:=1; MONTH:=2; MONTH:=3; MONTH:=4; MONTH:=5; MONTH:=6; MONTH:=7; MONTH:=8; MONTH:=9; MONTH:=10; MONTH:=11; MONTH:=12;
GetNext(s,i,r); Val(r,year,err); if length(r)=2 then year:=year+1900; GetNext(s,i,r); Val(r,hour,err); GetNext(s,i,r); Val(r,min,err); GetNext(s,i,r); Val(r,sec,err); GetNext(s,i,r); if length(r)=5 then begin Val(Copy(r,2,2),inch,err); Val(Copy(r,4,2),incmin,err); if s[1]='-' then begin inch:=-inch; incmin:=-incmin; end; end else begin if r='UT' then begin inch:=00; incmin:=00; end; if r='GMT' then begin inch:=00; incmin:=00; end; if r='EDT' then begin inch:=-4; incmin:=00; end; if r='CDT' then begin inch:=-5; incmin:=00; end; if r='MDT' then begin inch:=-6; incmin:=00; end; if r='PDT' then begin inch:=-7; incmin:=00; end; end; INCH:=3-INCH; INCMIN:=-INCMIN; Close(f); end; Function IntToStr(x:integer):string; {перевод из числа в строу} var r:string; {временная переменная} begin Str(x,r); IntToStr:=r; end; Function IntToStr2(x:integer):string; {перевод из числа в строку длиной 2} var r:string; begin Str(x,r); if length(r)=1 then r:='0'+r; IntToStr2:=r; end;
Procedure WriteF; {запись файла} var s,r:string; {временные переменные для хранения строки и 1 слова} begin Assign(f,'output.txt');
ReWrite(f); s:=''; if DAY=1 THEN r:='MON'; if DAY=2 THEN r:='TUE'; if DAY=3 THEN r:='WEN'; if DAY=4 THEN r:='THU'; if DAY=5 THEN r:='FRI'; if DAY=6 THEN r:='SAT'; if DAY=7 THEN r:='SUN'; s:=s+r+', '+IntToStr2(date); Case month of 1:r:='JAN'; 2:r:='FEB'; 3:r:='MAR'; 4:r:='APR'; 5:r:='MAY'; 6:r:='JUN'; 7:r:='JUL'; 8:r:='AUG'; 9:r:='SEP'; 10:r:='OCT'; 11:r:='NOV'; 12:r:='DEC'; end; s:=s+' '+r+' '+INtToStr(year)+' '+IntToStr2(hour)+':'+INtToStr2(min)+':'+INtToStr2(sec)+' +0300'; Writeln(f,s); Close(f); end;
Function LeapYear(x:integer):boolean; {проверка на високосный год} begin LeapYear:=((x mod 4 =0) and (x mod 100<>0)) or (x mod 400=0) end;
Procedure Incr; {изменение даты} var month1:integer; {используется для вычилсения даты} begin inc(min,incmin); if min>=60 then begin inc(hour); min:=min-60 end; if min<0 then begin dec(hour); min:=min+60 end; inc(hour,inch); if hour>=24 then begin inc(day); inc(date); hour:=hour-24 end; if hour<0 then begin hour:=hour+24; dec(day); dec(date) end; {день недели} if day<=0 then day:=day+7; if day>7 then day:=day-7; {день месяца} if (month<>2) or not LeapYear(year) then begin if date>daymonth[month] then begin date:=1; Inc(month) end; if date<=0 then begin
{сдвинуть месяц на 1 назад} dec(month); if leapyear(year) and (month=2) then day:=29 else begin month1:=month; if month1<=0 then inc(month1,12); if month1>12 then dec(month1,12); day:=Daymonth[month1]; end; end; end else begin if date>29 then begin date:=1; Inc(month) end; if date<=0 then begin {сдвинуть месяц на 1 назад} dec(month); day:=31; end; end; {проверить месяц} if month<=0 then begin Dec(year); month:=12; end; if month>12 then begin Inc(year); month:=1; end; end;
BEGIN ReadF; Incr; WriteF; END.
Задача7. " О Н Е П ЛА Т Е Ж А Х " Эта задача предлагалась на факультетской олимпиаде по информатике в 1998 году. Ниже приводится решение призёра олимпиады Колбешкина Дмитрия Михайловича, в настоящее время студента 5 курса факультета ПММ. Имеется N предприятий (N<=50) и задана матрица A размером N на N. Каждый элемент матрицы A[I,J] показывает какую сумму денежных средств предприятие I должно предприятию J. (Диагональные элементы матрицы A равны нулю.) Создать программу для устранения в матрице A всех ситуаций, когда предприятие I должно предприятию J, а предприятие J должно предприятию K. При этом не имеет значения, какое предприятие какому будет должно важно, чтобы баланс предприятия (сумма долга или, наоборот, сумма которую должны предприятию) не изменился. Технические требования: Входной файл: INPUТ.ТХТ Выходной файл: ОUTPUТ.ТХТ Ограничение времени: 5 секунд Формат входных данных: В первой строке входного файла содержится целое положительное число N. Далее в каждой строке файла содержатся строки матрицы A. Каждая строка содержит N положительных вещественных чисел - значений элементов соответствующей строки матрицы A.
Формат выходных данных: В каждой строке файла содержатся строки полученной матрицы A. Каждая строка содержит N положительных вещественных чисел - значений элементов соответствующей строки матрицы A. Пример файлов входных и выходных данных: INPUT.TXT 3 0 13.5 2.5 0 10 10
0 20 0
OUTPUT.TXT 0 1 0 0 0 0 0 0 0 Алгоритм решения 1. Подсчитаем баланс всех предприятий в отдельном массиве. Возможны варианты: а) предприятие никому ничего не должно (баланс = 0) б) предприятие кому-то что-то должно (баланс < 0) в) предприятию кто-то что-то должен (баланс > 0) 2. Находим 2 предприятия с балансами разных знаков. 3. Вычисляем сумму долга одного предприятия другому и запоминаем в матрице. Долг равен минимальному из двух чисел (балансов, взятых с положительным знаком). 4. Изменяем баланс этих предприятий, предполагая что долг был уплачен. Баланс у одного (или двух) предприятия стал = 0. 5. Если ещё остались предприятия с балансом <> 0 то возвращаемся к пункту 2. Program Plz1; {Автор Колбешкин Д.М.} Const MaxN = 50; Var fin,fout:text; i,j,N :integer; t :real; A : array[1..MaxN,1..MaxN] of real; {Матрица A} B : array[1..MaxN] of real; {Баланс предприятий} Begin writeln (' Задача о неплатежах'); assign(fin,'input.txt'); assign(fout,'output.txt'); reset(fin); rewrite(fout); read(fin,N); {Кол-во предприятий} for i:=1 to n do for j:=1 to n do read(fin,A[i,j]); {Заполняем матрицу A} for i:=1 to N do begin t:=0; for j:=1 to N do t:=t+A[i,j]-A[j,i]; {Считаем баланс} B[i]:=t; end; for i:=1 to N do
for j:=1 to N do A[i,j]:=0; {Здесь будет ответ} for i:=1 to N do if B[i]>0 then {Ищем баланс>0} begin j:=1; while B[i]>0 do begin if B[j]<0 then {Ищем баланс<0} if B[i]<(-B[j]) then {"Считаем долг"} begin A[i,j]:=B[i]; {"платим" долг} B[j]:=B[j]+B[i]; {Изменяем баланс} B[i]:=0; {Изменяем баланс} end else begin A[i,j]:=-B[j]; {"платим" долг} B[i]:=B[j]+B[i]; {Изменяем баланс} B[j]:=0; {Изменяем баланс} end; j:=j+1; end; end; for i:=1 to N do { Вывод ответа в файл } begin for j:=1 to N do if A[i,j]=trunc(A[i,j]) then write(fout,trunc(A[i,j]),' ') else write(fout,A[i,j],' '); writeln(fout); end; close(fin); close(fout); End.
Задача8. " О дор огах " Эта задача предлагалась на межвузовской олимпиаде по информатике в 1998 году. Ниже приводится решение призёра олимпиады Колбешкина Дмитрия Михайловича – в настоящее время студента 5 курса факультета ПММ. Имеется N (N<=50) городов и система дорог, соединяющая эти города. Любые два города может соединять не более одной дороги. По любой дороге, соединяющей два города можно проехать в обе стороны. Создать программу для определения, существуют ли города, из которых можно выехать по одной дороге, а вернуться в них по другой. Технические требования: Входной файл: INPUТ.ТХТ Выходной файл: ОUTPUТ.ТХТ Ограничение времени: 10 секунд. Формат входных данных: В первой строке входного файла содержится целое положительное число N. Далее каждая строка файла содержит два целых положительных числа I и J, означающих, что есть дорога, соединяющая I-ый и J-ый города. Формат выходных данных:
В выходном файле указываются целые числа - номера городов, из которых можно выехать по одной дороге, а вернуться в них по другой. Пример файлов входных и выходных данных: INPUT.TXT 5 1 2 2 3 3 4 1 3 5 4 OUTPUT.TXT 1 2 3 Алгоритм решения 1. Выберем один город из списка. Этот город объявляем началом пути. (Если городов больше нет - то переходим к пункту 5.) Выберём одну из дорог, соединяющую этот город с другим. (Если дорог больше нет - то переходим к пункту 1.) Идём по выбранной дороге в следующий город. Закрываем дорогу. Это делаем для того, что бы не пройти по ней ещё раз. 2. Проверяем, не вернулись ли мы к началу? (Тогда все города на нашем пути удовлетворяют условию задачи и мы их запоминаем!!!) (Переходим к пункту 4.) 3. Выберем одну из дорог, соединяющую этот город с другим, в ещё нет флага. (Если дорог больше нет - то переходим к пункту Перед уходом ставим флаг. Он означает что город уже БЫЛ у пути. Идём по выбранной дороге в следующий город. (Переходим к 2.)
котором 4.) нас на пункту
4. По своим следам возвращаемся в предыдущий город. Если мы вернулись НЕ к началу пути то: Убираем флаг. (Переходим к пункту 3.) Если мы вернулись к началу пути то: Открываем дорогу по которой вернулись. (Переходим к пункту 1.) 5. Все нужные города найдены... *) Program Plz2; {Автор Колбешкин Д.М.} Const MaxN = 50; Var i,j,N,t : byte; fin,fout : text; a : array [1..MaxN,1..MaxN] of byte; {Матрица дорог} b : array [1..MaxN] of byte; {Запоминаем путь} c : array [1..MaxN] of byte; {Формируем ответ} Procedure Rekurs(k:byte); var l:byte; сходить} begin if k=i then begin
{k - город, в котором мы сейчас} {l - город, в который думаем {i - начало пути} {Мы вернулись к началу?}
c[i]:=1; for t:=1 to N do if b[t]=1 then c[t]:=1 end else for l:=1 to N do новому городу?} if (a[k,l]<>0) and (b[l]=0) begin b[k]:=1; Rekurs(l); b[k]:=0; end; end;
{Смотрим - есть ли дорога к and (c[i]=0) then {Ставим влаг перед уходом} {Идём в следующий город} {Убираем флаг при обратном пути}
Begin writeln (' Задача о дорогах '); assign(fin,'input.txt'); assign(fout,'output.txt'); reset(fin); rewrite(fout); read(fin,n); for i:=1 to N do for j:=1 to N do a[i,j]:=0; for i:=1 to N do b[i]:=0; for i:=1 to N do c[i]:=0; while not Eof(fin) do {Составляем карту дорог} begin readln(fin,i,j); a[i,j] := 1; a[j,i] := 1; end; for i:=1 to N do for j:=1 to N do if (c[i]=0)and(a[i,j]=1) then begin a[i,j]:=0; {Закрываем дорогу} a[j,i]:=0; {Закрываем дорогу} Rekurs(j); {Идём в следующий город} a[i,j]:=1; {Открываем дорогу} a[j,i]:=1; {Открываем дорогу} end; for i:=1 to N do if c[i]=1 then write(fout,i,' '); close(fin); close(fout); End.
Задача9. " Д Е Н ЬГИ " Эта задача предлагалась на факультетской олимпиаде по информатике в 1999 году. Ниже приводится решение призёра олимпиады Колбешкина Дмитрия Михайловича – в настоящее время студента 5 курса факультета ПММ. Имеется денежная сумма в N единиц. Требуется написать программу для определения, можно ли представить данную сумму денег купюрами
достоинством в a1,a2,:,ak единиц, количестве. Числа N,a1,:,ak целые.
имеющимися
в
неограниченном
Технические требования: Входной файл: INPUT.TXT Выходной файл: OUTPUT.TXT Ограничение времени: 5 секунд Формат входных данных: В первой строке входного файла содержатся числа N и K. Далее в каждой строке файла содержатся достоинства имеющихся купюр. Формат выходных данных: Первая строка выходного файла должна содержать представить и NO, если нельзя представить.
YES,
если
можно
Пример входного и выходного файла: INPUT.TXT 13 3 3 7 11 OUTPUT.TXT NO Алгоритм решения Алгоритм простой купюр.
перебор всех возможных
комбинаций из данных
Program Plz3; {Автор Колбешкин Д.М.} Var fin,fout :text; i,N,K :integer; a :array[1..100]of integer; bool :boolean; Procedure NextS(Sum,t:integer); {Sum - сумма денег, которую мы собрали} var j,i:integer; {t - номер купюры} begin if sum=N then begin bool:=true {Мы набрали нужную сумму денег} end else begin if sum < N then begin for j:=t to K do {Выбираем купюку} if (a[j]>0) then begin i:=1; {i - кол-во купюр, которые мы добавляем} while (sum+a[j]*i <= N) and (not bool) do begin NextS(sum+a[j]*i,j+1); i:=i+1; end; end; end; end; end;
BEGIN writeln (' Задача про деньги '); assign(fin,'input.txt'); assign(fout,'output.txt'); reset(fin); rewrite(fout); read(fin,N,K); bool:=false; for i:=1 to K do begin read(fin,a[i]); if a[i]>0 then if (N/a[i])=trunc(N/a[i]) then bool:=true; end; NextS(0,1); {Начинаем собирать сумму денег с первой купюры} if bool then write(fout,'YES') else write(fout,'NO'); close(fin); close(fout); END.
Задача10. " П ар тии" Задача предлагалась на первом (заочном)туре Открытой региональной студенческой школы-олимпиады по программированию и компьютерному моделированию 17-19 сентября 2001 года. Автор решения: Бурнаев Константин Евгеньевич, один из призеров первого тура олимпиады, студент 4 курса Факультета автоматизации производств и информационных технологий Белгородской технологической академии строительных материалов (специальность 22.04.00 "Программное обеспечение автоматизированных систем и вычислительной техники") e-mail:
[email protected] Компиляторы: gcc.exe, cl.exe (VC6.0) Н а острове BORLAND к ажд ы й и з е го жи те ле й орган и зовал п арти ю , к отору ю сам и возглави л. В кажд ой п арти и – н е м е н е е д ву х че лове к . По К он сти ту ци и острова в п арлам е н т д олжн ы войти главы все х п арти й, н о фи н ан совы е тру д н ости н е п озволяю т это сд е лать. Н а ре фе ре н д у м е гражд ан е острова ре ш и ли , что кажд у ю п арти ю в п арлам е н те д остаточн о п ре д ставлятьод н и м чле н ом п арти и . Т ре бу е тся сформ и ровать п арлам е н ткак м ожн о м е н ьш е й чи сле н н ости , в к отором бы ли бы п ре д ставле н ы все п арти и . Т ехнические тр ебования . В се главы п арти й (и п арти и ) п е ре н у м е рован ы от1 д о N (4<=N<=150). Входные да нные. Пе рвая строка вход н ого те к стового файла input.txt сод е ржи т N - чи сло п арти й, в к ажд ой и з п осле д у ю щ и х строк п е ре чи сляю тся че ре з п робе л п оряд ковы е н ом е ра гражд ан – чле н ов соотве тству ю щ е й п арти и . Выходные да нные. В ы ход н ой те кстовы й файлoutput.txt сод е ржи тп оряд к овы е н ом е ра глав п арти й, вош е д ш и х в п арлам е н т. Пр им ер . Input.txt output.txt N 4 2 1 2 3 4 2 3 3 1 4 2 4 2
#include <stdlib.h> #include <stdio.h>
#ifdef DEBUG #define DBG(params) printf params #else #define DBG(params) #endif /* ===== Коды возврата функций ===== */ #define #define #define #define #define #define
ERR_OK 0 ERR_PARAM 1 ERR_MEMORY 2 ERR_FILE 3 ERR_FILEFORMAT 4 ERR_FAILED 5
/* ===== Работа с матрицами ===== */ #define MATR_BASETYPE unsigned char #define VECT_BASETYPE unsigned int struct t_vect { VECT_BASETYPE *m_ptr; unsigned int m_size; }; /* создание нового вектора Выходные данные: x --- длина вектора Выходные данные: vect --- структура, описывающая вектор */ int alloc_vect (unsigned int x, struct t_vect *vect) { /* проверка правильности входных данных */ if (x==0) { DBG(("Error calling 'alloc_vect': x=%u\n", x)); return ERR_PARAM; }; /* выделение памяти */ vect->m_ptr = calloc(sizeof(VECT_BASETYPE), x); vect->m_size = x; /* проверка */ if ( vect->m_ptr == NULL ) { DBG(("Error allocating memory in 'alloc_vect': x=%u\n",x)); return ERR_MEMORY; }; DBG(("Successful call to 'alloc_vect': x=%u, vect=%p\n",x,vect)); return ERR_OK; } /* Удаление старого вектора */ void free_vect(struct t_vect *vect) { if (vect->m_ptr == NULL) { DBG(("Trying to free memory more than once in 'free_vect': vect=%p\n", vect)); return; }; free(vect->m_ptr); vect->m_ptr=NULL;
vect->m_size=0; DBG(("Successful call to 'free_vect': vect=%p\n",vect)); } /* Получение указателя на элемент вектора */ VECT_BASETYPE* at_vect(unsigned int x, struct t_vect *vect) { /* проверка корректности аргументов */ if (x >= vect->m_size) { DBG(("Error calling 'at_vect': x=%u, vect>m_size=%u\n",x, vect->m_size)); return NULL; }; DBG(("Successful call to 'at_vect': x=%u, vect=%p\n",x,vect)); return &vect->m_ptr[ x ]; } struct t_matr { MATR_BASETYPE *m_ptr; unsigned int m_xsize, m_ysize; }; /* Создание новой матрицы. Входные данные: x,y --- размеры матрицы Выходные данные: matr --- матрица Примечание: начальное значение всех элементов равно 0; если память под матрицу уже выделена, она не освобождается */ int alloc_matr(unsigned int x, unsigned int y, struct t_matr *matr) { /* проверка корректности входных данных */ if ((x==0) || (y==0)) { DBG(("Error calling 'alloc_matr': x=%u, y=%u\n",x,y)); return ERR_PARAM; }; /* выделение памяти */ matr->m_ptr = calloc(sizeof(MATR_BASETYPE), x*y); matr->m_xsize = x; matr->m_ysize = y; /* проверка */ if ( matr->m_ptr == NULL ) { DBG(("Error allocating memory in 'alloc_matr': x=%u, y=%u\n",x,y)); return ERR_MEMORY; }; DBG(("Successful call to 'alloc_matr': x=%u, y=%u, matr=%p\n",x,y,matr)); return ERR_OK; } /* Удаление старой матрицы */ void free_matr(struct t_matr *matr) { if (matr->m_ptr == NULL) { DBG(("Trying to free memory more than once in 'free_matr': matr=%p\n", matr)); return; }; free(matr->m_ptr); matr->m_ptr=NULL;
matr->m_xsize=0; matr->m_ysize=0; DBG(("Successful call to 'free_matr': matr=%p\n",matr)); } /* Получение указателя на элемент "двумерной" матрицы */ MATR_BASETYPE* at_matr(unsigned int x, unsigned int y, struct t_matr *matr) { /* проверка корректности аргументов */ if ((x >= matr->m_xsize) || (y >= matr->m_ysize)) { DBG(("Error calling 'at_matr': x=%u, y=%u, matr>m_xsize=%u, matr->m_ysize=%u\n",x,y, matr->m_xsize, matr->m_ysize)); return NULL; }; DBG(("Successful call to 'at_matr': x=%u, y=%u, matr=%p\n",x,y,matr)); return &matr->m_ptr[ y*matr->m_xsize + x ]; } /* ===== Работа с файлами ===== */ /* чтение исходных данных. Входные данные: filename --- имя файла Выходные данные: matr --- матрица принадлежности граждан партиям */ int ReadInput (const char *filename, struct t_matr *matr) { FILE *fh; unsigned int N; unsigned int ibuffer; int i; int result; char buffer[10000]; char *cur_pos; int offset; fh=fopen(filename, "r"); /* проверка результата */ if (fh == NULL) { DBG(("Error opening file in 'ReadInput': filename=%s\n",filename)); return ERR_FILE; }; if (fscanf(fh,"%u",&N) != 1) { DBG(("Error reading table size in 'ReadInput': filename=%s\n",filename)); fclose(fh); return ERR_FILEFORMAT; }; /* выделение новой матрицы */ alloc_matr(N,N,matr); fgets(buffer, 10000, fh); for (i=0; i
/* внимание: нумерация элементов в матрице -- с нуля, нумерация
партий --- с единицы! */ *at_matr(i,ibuffer-1,matr)=1; cur_pos += offset;
}; } else { DBG(("Failed to read line %u in 'ReadInput': filename=%s\n",i,filename)); fclose(fh); return ERR_FILEFORMAT; }; }; fclose(fh); DBG(("Successful call to 'ReadInput': filename=%s\n",filename)); return ERR_OK; } int WriteOutput(const char *filename, struct t_vect *vect) { int x,y; FILE *fh; fh=fopen(filename, "w+"); /* проверка результата открытия файла */ if (fh == NULL) { DBG(("Error creating file in 'WriteOutput': filename=%s\n", filename)); return ERR_FILE; }; for (x=0; x
m_size; x++) { fprintf(fh, "%u ", (*at_vect(x,vect))+1); }; fclose(fh); DBG(("Successful call to 'WriteOutput': filename=%s\n", filename)); return ERR_OK; } /* ===== собственно решение задачи ===== */ /* оболочка "решателя" Входные данные: matr --- бинарная матрица, которую необходимо покрыть Выходные данные: vect (изначально неинициализирован) --вектор результатов */ int GenCombination(unsigned int n, unsigned int k, struct t_vect *vect) { int i; i=vect->m_size-1; (*at_vect(i,vect))++; while ((*at_vect(i,vect) > n-1) && (i>0)) { (*at_vect(i-1,vect))++; i--; };
for (; i+1m_size; i++) { *at_vect(i+1,vect) = *at_vect(i,vect)+1; }; if (*at_vect(i,vect) < n) return ERR_OK; return ERR_FAILED; } int TestCombination(struct t_matr *matr, struct t_vect *vect) { int x,p; struct t_vect excluded; int excl_size; alloc_vect(matr->m_xsize,&excluded); excl_size=0; for (p=0; pm_size; p++) { for (x=0; x<matr->m_xsize; x++) { if (*at_matr(x,*at_vect(p,vect),matr)) { if (!*at_vect(x,&excluded)) { excl_size++; (*at_vect(x, &excluded)) ++; }; }; }; }; free_vect(&excluded); if (excl_size < matr->m_xsize) { return ERR_FAILED; } else { return ERR_OK; }; } int SolvePrecise(struct t_matr* matr, struct t_vect* vect) { int k,i; alloc_vect(matr->m_ysize, vect); for (k=1; k<matr->m_ysize; k++) { vect->m_size=k; for (i=0; im_ysize, k, vect) == ERR_OK); }; vect->m_size=0; DBG(("Successful call to 'Solve'; no solution found!\n")); return ERR_FAILED; } int CalcMarks(struct t_matr *matr, struct t_vect *vect, struct t_vect *excl) { int x,y;
int max, imax; max=0; imax=0; for (y=0; y<matr->m_ysize; y++) { for (x=0; x<matr->m_xsize; x++) { if (*at_vect(x,excl) == 0) { *at_vect(y,vect) += *at_matr(x,y,matr); if (*at_vect(y,vect) > max) { max=*at_vect(y,vect); imax=y; }; }; }; }; return imax; } int Solve(struct t_matr* matr, struct t_vect* vect) { struct t_vect marks, excluded; unsigned int excl_num; int i,pos; int solve_size; alloc_vect(matr->m_ysize, vect); alloc_vect(matr->m_ysize, &marks); alloc_vect(matr->m_xsize, &excluded); excl_num=0; solve_size=0; while (excl_num < matr->m_xsize) { for (i=0; i<marks.m_size; i++) *at_vect(i,&marks)=0; pos=CalcMarks(matr, &marks, &excluded); *at_vect(solve_size, vect)=pos; solve_size++; for (i=0; i<matr->m_xsize; i++) { if (*at_matr(i,pos,matr)) { if (!*at_vect(i,&excluded)) { excl_num++; }; (*at_vect(i,&excluded))++; }; }; }; vect->m_size = solve_size; free_vect(&excluded); free_vect(&marks); DBG(("Successful call to 'Solve'\n")); return ERR_OK; } /* ===== входная точка программы ===== */ int main(int argc, char *argv[]) { struct t_matr matr; struct t_vect solution; ReadInput("input.txt",&matr); if (matr.m_xsize > 60) {
Solve(&matr, &solution); } else { SolvePrecise(&matr, &solution); }; free_matr(&matr); WriteOutput("output.txt",&solution); free_vect(&solution); return ERR_OK; }
Задача11. " П ер еселение" Задача предлагалась на первом (заочном)туре Открытой региональной студенческой школы-олимпиады по программированию и компьютерному моделированию 17-19 сентября 2001 года. Автор решения: Козлов Юрий Станиславович, один из призеров первого тура олимпиады, студент 1 курса РТФ ВИ МВД РФ 16гр Н а К ом п ью те рн ой у ли це жи ву т в собстве н н ы х д ом ах тольк о се м ьи Паскалё вы х и С и п лю сп лю совы х. О н и ре ш и ли п е ре се ли ться так , чтобы все Паскалё вы жи ли в н ачале у ли цы , а все С и п лю сп лю совы - в к он це . Изве стн о общ е е коли че ство д ом ов н а у ли це и кто жи ве т в кажд ом д ом е . Т ре бу е тся разработать м од е ль и алгори тм (п рограм м у ) п е ре се ле н и я, п ри у слови и , что кажд ая се м ья д олжн а п е ре е зжатьн е боле е од н ого раза, а в кажд ом обм е н е д олжн ы у частвовать только д ве се м ьи .
Uses Crt,Dos; const n=30; delayy=200;{ <= измените, если тормозит заставка} Var street,street2:array[1..n] of integer; i,s,left,right,j,k,a,b,q,f:integer; Procedure HideCursor; Var regs: registers; Begin regs.ah:=1; regs.ch:=$20; regs.cl:=0; regs.bh:=0; Intr($10,regs); End; Procedure Introduction; {заставка} var i,x,y,cx,cy,ctx,cty,textn,maxx,maxy:byte; text:array[1..20] of string; index:char; Begin HideCursor; cx:=42; cy:=13; maxx:=32; maxy:=8; ctx:=cx-maxx+1; cty:=cy-maxy-1; Text[1]:=' Козлов Юрий Станиславович'; Text[2]:=' ВИ МВД России'; Text[3]:=' 394065, г.Воронеж Прспект Патриотов, 53,'; Text[4]:=' тел. 33-18-67 '; Text[5]:=''; Text[6]:=' Радиотехнический факультет';
Text[7]:='Информационная безопасность телекоммуникационных систем'; Text[8]:='(обеспечение информационной безопасности телекоммуникационных'; Text[9]:=' систем в ОВД)'; Text[10]:=' дневная форма обучения'; Text[11]:=' Потанин Виталий Евгеньевич '; Text[12]:=''; Text[13]:=' Енина Зоя Ивановна (Лицей №1)'; Text[14]:=''; Text[15]:=' 394016, г.Воронеж Московский пр-т д.82, кв.236'; Text[16]:=' тел. 74-91-12 '; textn:=16; TextBackGround(Blue); TextColor(White); For y:=0 to maxy do begin GotoXy(cx-1,cy-1-y);Write('г¬'); GotoXy(cx-1,cy-y); Write('¦¦'); GotoXy(cx-1,cy-1+y);write('¦¦'); GotoXy(cx-1,cy+y); Write('L-'); Delay(delayy); end; For x:=0 to maxx do begin GotoXy(cx-1-x,cy-1-maxy);Write('г'); GotoXy(cx-1-x,cy+maxy); Write('L'); GotoXy(cx+x,cy-1-maxy); Write('¬'); GotoXy(cx+x,cy+maxy); Write('-'); for y:=1 to 2*maxy do begin GotoXy(cx-x,cy-1-maxy); Write('='); GotoXy(cx-1+x,cy-1-maxy);Write('='); GotoXy(cx-x,cy-1-maxy+y); Write(' '); GotoXy(cx-1+x,cy-1-maxy+y);Write(' '); GotoXy(cx-x,cy+maxy); Write('='); GotoXy(cx-1+x,cy+maxy);Write('='); GotoXy(cx-1-x,cy-1-maxy+y);Write('¦'); GotoXy(cx+x,cy-1-maxy+y); Write('¦'); end; Delay(delayy); end; for index:=chr(40) to chr(255) do begin For y:=1 to textn do begin x:=1; While length(text[y])>=x do begin if Text[y][x]=index then begin case y of 1:textcolor(LightRed); 2:textcolor(LightGreen); 3..5:textcolor(LightGray); 6..9:textcolor(Yellow); 10:textcolor(Green); 11,12:textcolor(LightGray); 13,14:textcolor(LightBlue); 15..17:textcolor(LightRed); end; gotoxy(ctx+x,cty+y); write(text[y][x]);
delay(delayy div 4); end; x:=x+1; end; end; end; GotoXY(80,25); ReadLn; TextBackGround(Black); TextColor(LightGray); ClrScr; End; Procedure change(a1,b1:integer); {меняет местами два элемента массива street} begin if street[a1]=0 then begin street[b1]:=0; street[a1]:=1; end; end; Begin ClrScr; Randomize; Introduction; for i:=1 to n do street[i]:=random(2); {случайное заполнение улицы} street2:=street; s:=0; left:=0; right:=0; write(' '); For i:=1 to n do begin if street[i]=1 then textcolor(LightRed) else TextColor(yellow); write(street2[i],' '); end; writeln; writeln; for i:=1 to n do if street[i]=1 then s:=s+1;{считаем общее число 1} for i:=1 to s do if street[i]=1 then left:=left+1;{определяем к какому краю} for i:=n-s+1 to n do if street[i]=1 then right:=right+1;{рациональнее } if left>=right then begin i:=0; j:=n+1; a:=1; b:=-1; q:=sleft;end{премещать} else begin i:=n+1; j:=0; a:=-1;b:=1; q:=s-right; end;{} for f:=1 to q do begin repeat i:=i+a; until street[i]=0;{находим крайний нолик} repeat j:=j+b; until street[j]=1;{находим крайнюю единичку} change(i,j); {меняем их местами} textcolor(LIghtgreen); write(f,') '); For k:=1 to n do begin {выводим полученное на экран} if street[k]=1 then textcolor(LightRed) else textcolor(Yellow); write(street[k],' '); end; Writeln; end; TextColor(LightRed); GotoXY(56,24);Write('1');TextColor(Yellow); write(' - Семья Паскалёвых'); GotoXY(56,25); write('0');TextColor(LightRed); write(' - Семья Сиплюсплюсовых');TextColor(LightGray); GotoXy(2,25);Write('Press');TextColor(DarkGray); Write(' any key');TextColor(LightGray); write(' to exit.'); i:=1;j:=1;
Repeat i:=i+1; if i mod 10000 = 0 then begin j:=j+1; if j mod 2 = 0 then textcolor(white) else textcolor(darkgray); i:=1; end; GotoXy(8,25);write('any key'); Until keypressed; ReadKey; {нажимаем any key для выхода} End.
Авторы : д оц. О .Ф .У скова, д оц. О .Д .Горбе н к о, п роф. А.И.Ш аш ки н Ре д ак тор – Л .А.Ан д ре йчи кова
О ли м п и ад н ы е зад ачи п о п рограм м и рован и ю . Л у чш и е ре ш е н и я. В тре х частях. Часть 2.: У че бн ое и зд ан и е / О .Ф .У скова, О .Д .Горбе н ко, А.И.Ш аш ки н – В орон е ж: О О О ПФ «Д жу д и », 2001 – 64 с. О тп е чатан о в О О О ПФ «Д жу д и », ти раж. 200 экз.