示例#1
0
        static void Main(string[] args)
        {
            List <long> emptySegments = new List <long>();//список размеров пустых отрезков

            Console.WriteLine("Введите число камней");
            long stonesCount = Convert.ToInt64(Console.ReadLine());//Количество камней

            Console.WriteLine("Введите число жуков < числа камней");
            long bugsCount = Convert.ToInt64(Console.ReadLine()); //Количество жуков

            emptySegments.Add(stonesCount);                       //Помещаем в список размер первого пустого отрезка (стартовое количество камней)

            Console.WriteLine();
            for (int i = 0; i < bugsCount; i++)
            {
                long         maxSegment   = emptySegments[0];   //Выбираем из списка размер максимального свободного отрезка, он всегда первый в списке
                DivideResult divideResult = Divide(maxSegment); //Делим этот отрезок на 2 части (помещаем жука в центр)
                if (i == bugsCount - 1)                         //Проверяем последний ли это жук, и если да то выводим результат на экран
                {
                    Console.WriteLine("Число незанятых камней слева и справа");
                    Console.WriteLine(divideResult.LeftSegmentSize.ToString() + "/" + divideResult.RightSegmentSize.ToString());
                    Console.ReadLine();
                    return;
                }


                emptySegments.Remove(maxSegment);                 //Убираем из списка только что разделенный отрезок (а точнее его размер)
                emptySegments.Add(divideResult.RightSegmentSize); //Добавляем размер отрезка справа от только что помещенного жука
                emptySegments.Add(divideResult.LeftSegmentSize);  //Добавляем размер отрезка слева от только что помещенного жука
            }
        }
示例#2
0
        /// <summary>
        /// Вычисляет размер отрезка слева и размер отрезка справа от помещенного жука
        /// </summary>
        /// <param name="segmentSize">Размер входного отрезка для разделения</param>
        /// <returns></returns>
        static DivideResult Divide(long segmentSize)
        {
            DivideResult r = new DivideResult();

            if (segmentSize % 2 != 0)//если число нечетное
            {
                r.LeftSegmentSize  = (segmentSize - 1) / 2;
                r.RightSegmentSize = (segmentSize - 1) / 2;
            }
            else
            {
                r.LeftSegmentSize  = (segmentSize / 2) - 1;
                r.RightSegmentSize = segmentSize / 2;
            }
            return(r);
        }