Олимпиадная задача. Максимальное количество различных этикеток. - C#

Узнай цену своей работы

Формулировка задачи:

Вася коллекционирует спичечные этикетки. Для этого у него есть N альбомов вместимостью K1, K2, …, KN этикеток. Вася хочет, чтобы в случае утери одного любого альбома каждая этикетка осталась у него хотя бы в одном экземпляре. Для этого он покупает каждую этикетку в двух экземплярах, и наклеивает их в два разных альбома. Какое максимальное количество различных этикеток при этом может оказаться в его коллекции?

Решение задачи: «Олимпиадная задача. Максимальное количество различных этикеток.»

textual
Листинг программы
class Program
{
    static int[] array;
 
    static void Main(string[] args)
    {
        int albums = 0;
        Console.Write("Введите количество альбомов: ");
        while(!int.TryParse(Console.ReadLine(), out albums))
        {
            Console.Write("Введённое число некорректно, попробуйте ещё раз: ");
        }
 
        array = new int[albums];
        for(int i = 0; i < albums; i++)
        {
            int size = 0;
            Console.Write("Введите размер {0} альбома: ", i+1);
            while (!int.TryParse(Console.ReadLine(), out size))
            {
                Console.Write("Введённое число некорректно, попробуйте ещё раз: ");
            }
            array[i] = size;
        }
 
        int sum = 0;
        for(int i = 0; i < array.Length-1; i++)
        {
            int max = FindMaximumIndex();
            int premax = FindPreMaximumIndex(max);
            sum += array[premax];
            array[max] -= array[premax];
            array[premax] = 0;
        }
 
        Console.WriteLine("Максимальное число этикеток: {0}", sum);
        Console.ReadLine();
    }
 
    static int FindMaximumIndex()
    {
        int maximumIndex = 0;
        int maximum = -1;
 
        for(int i = 0; i < array.Length; i++)
        {
            if(array[i] > maximum)
            {
                maximum = array[i];
                maximumIndex = i;
            }
        }
        return maximumIndex;
    }
 
    static int FindPreMaximumIndex(int maxIndex)
    {
        int premaximumIndex = 0;
        int premaximum = -1;
 
        for (int i = 0; i < array.Length; i++)
        {
            if(array[i] > premaximum && i != maxIndex)
            {
                premaximum = array[i];
                premaximumIndex = i;
            }
        }
        return premaximumIndex;
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.462 из 5
Похожие ответы