Олимпиадная задача. Максимальное количество различных этикеток. - 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;
}
}