Задача 2. «Колесо Фортуны» Имя входного файла: wheel. in Имя выходного файла: wheel. out Ограничение по времени: 2 секунды Ограничение по памяти: 256 Мбайт
Развлекательный
телеканал транслирует шоу «Колесо Фортуны». В процессе игры участники
шоу крутят большое колесо, разделенное на сектора. В каждом секторе
этого колеса записано число. После того как колесо останавливается,
специальная стрелка указывает на один из секторов. Число в этом секторе
определяет выигрыш игрока.
Юный
участник шоу заметил, что колесо в процессе вращения замедляется из-за
того, что стрелка задевает за выступы на колесе, находящиеся между
секторами. Если колесо вращается с угловой скоростью v градусов в
секунду, и стрелка, переходя из сектора X к следующему сектору, задевает
за очередной выступ, то текущая угловая скорость движения колеса
уменьшается на к градусов в секунду. При этом если v < к, то колесо
не может преодолеть препятствие и останавливается. Стрелка в этом случае
будет указывать на сектор Х.
Юный
участник шоу собирается вращать колесо. Зная порядок секторов на
колесе, он хочет заставить колесо вращаться с такой начальной скоростью,
чтобы после остановки колеса стрелка указала на как можно большее
число. Колесо можно вращать в любом направлении и придавать ему
начальную угловую скорость от а до Ъ градусов в секунду. Требуется
написать программу, которая по заданному расположению чисел в секторах,
минимальной и максимальной начальной угловой скорости вращения колеса и
величине замедления колеса при переходе через границу секторов
вычисляет максимальный выигрыш.
Решение:
Turbo Pascal
| Perl (решение предоставил Konstantinus)
| program wheel; var ft:text; n,a,b,k,i,x,v:integer; sekt: array[1..100] of integer; BEGIN Assign(ft,'wheel.in'); Reset(ft); Readln(ft,n); for i:=1 to n-1 do Read(ft,sekt[i]); Readln(ft,sekt[n]); Read(ft,a); Read(ft,b); Read(ft,k); close(ft); x:=sekt[1]; repeat v:=(a div k) mod n; if sekt[v]<sekt[n-v+1] then v:=n-v+1; if x<sekt[v] then x:=sekt[v]; a:=a+k; until a>=b; Assign(ft,'wheel.out'); Rewrite(ft); writeln(ft,x); close(ft); END. | #!/usr/bin/perl #прописываем путь к perl #use strict; #включаем вывод сообщений об ошибке подключением модуля strict use IO::File;
# подключаем модуль IO::FIle для работы с файлами в объектно-ориентированном контексте
my $file_in="wheel.in"; my $fh1 = IO::File->new("<$file_in") or die "Can`t open $file_from: $!\n";
#определяем входной файл, в случае ошибки при открытии файла выводится соответствующее сообщение с указанием типа ошибки
my $file_out="wheel.out"; my $fh2 = IO::File->new(">$file_out") or die "Can`t open $file_to: $!\n";
#то же для выходного файла. Если он не существует, то будет создан
my $n = $fh1->getline; # читаем 1 строку из файла в переменную my $line = $fh1->getline; # читаем 2 строку из файла в переменную my @numbers1 = split (/\s+/,$line); # режем переменную с числами на отдельные числа, записываем их в 1 массив скаляров my $line = $fh1->getline; # читаем 3 строку из файла в переменную my @numbers2 = split (/\s+/,$line); # режем переменную с числами на отдельные числа, записываем их вo 2 массив скаляров
############### ВЫЧИСЛЕНИЯ ################# my $x=$numbers1[0]; do { my $v = (int($numbers2[0]/$numbers2[2]))%$n; STDOUT->print ("v=$v\n"); $v=$n-$v+1 if ($numbers1[$v-1] lt $numbers1[$n-$v]); if ($x lt $numbers1[$v-1]) {$x=$numbers1[$v-1]}; $numbers2[0]=$numbers2[0]+$numbers2[2]; } until $numbers2[0] ge $numbers2[1];
############### ВЫВОД РЕЗУЛЬТАТА В ФАЙЛ ################
$fh2->print($x);
|
|