понедельник, 2 июля 2018 г.

C# олімпіадні задачі


Офіс
Крім складання послідовностей, влітку Вася дуже любив дивитись у вікно. Напроти його будинку розмістився офіс деякої будівельної фірми. Протягом всього місяця Вася спостерігав за його співробіниками. Про кожен з 31 дня місяця він знає, скільки працівників прийшло на роботу. Йому також відомо, що кjжен з працівників має рівно 4 вихідних в місяць.
Тепер він ламає голову над загадкою – скільки всього працівників працює у цьому офісі. Напишіть програму, яка дасть відповідь Васі на це питання.
Вхідні дані
Вводиться 31 ціле невід'ємне число. Ці числа описують кількість працівників, які прийшли в офіс до відповідних днів місяця. Гарантується, що вхідні дані коректні.
Вихідні дані
Виведіть єдине число - загальна кількість працівників офісу. Гарантується, що відповідь не перевищує 100.
Вхідні дані
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0
Вихідні дані
10
Пояснення: В прикладі всі числа записано в одному рядку.
static void Main(string[] args)
        {
            int sum = 0, tmp;
            string st = Console.ReadLine();
            var massiv = st.Split(' ');
            for (int i = 0; i < 31; i++)
            {
                tmp= int.Parse(massiv[i]);
                sum += tmp;
            }
            Console.WriteLine(sum/27);
        }
Тости
Ви бажаєте підсмажити кілька тостів для майбутньої вечірки. Є сковорода, на якій може смажитися одночасно k тостів. Підсмажування тосту з одного боку займає 2 хвилини. Будемо вважати, що операції розміщення тосту на сковороді, перевертання і зняття тосту зі сковороди виконуються миттєво. Напишіть програму, яка обчислює мінімальний час в хвилинах для підсмажування n тостів. Тости не можна знімати зі сковороди раніше або пізніше 2 хвилин, необхідних для підсмажування однієї сторони. Кожен тост потрібно підсмажити з обох сторін.

Вхідні дані

В одному рядку містяться два цілих числа n і k, розділених пропуском (0 ≤ n ≤ 10001 ≤ k ≤ 50) - кількість тостів і місткість сковороди.

Вихідні дані

Вивести одне ціле число - мінімальний час в хвилинах для підсмажування n тостів.
Вхідні дані
3 2
Вихідні дані
6
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int n = int.Parse(massiv[0]);
            int k = int.Parse(massiv[1]);
            int res;
            if (n==0) res = 0;
            else
                if (n <= k) res = 4;
            else
            {
                res = 2 * n / k;
                if (2 * n % k>0) res++;
                res *= 2;
            }
            Console.WriteLine(res);
        }
Порівняння довгих чисел
Задано два числа. Визначте, яке з них більше.
Вхідні дані
У двох рядках знаходяться два числа a та b (1 ≤ ab ≤ 101000).
Вихідні дані
Виведіть один із знаків по ситуації: "**".
Вхідні дані #1
3
5
Вихідні дані #1
< 
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            BigInteger a = BigInteger.Parse(massiv[0]);
            string s1 = Console.ReadLine();
            var massiv1 = s1.Split(' ');
            BigInteger b = BigInteger.Parse(massiv1[0]);
           if (a>b) Console.WriteLine(">");
            if (a < b) Console.WriteLine("<");
            if (a == b) Console.WriteLine("=");
        }
Умовний оператор - 1
Розрахуйте значення y у відповідності з наступним умовою:
Вхідні дані
Одне ціле число x (-1000 ≤ x ≤ 1000).

Вихідні дані
Виведіть значення y відповідно до заданого умовою:
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int x = int.Parse(massiv[0]);
            int y;
            if (x < 5)
            {
                y = x * x - 3 * x + 4;
                Console.WriteLine(y);
            }
            if (x >= 5)
            {
                y = x + 7;
                Console.WriteLine(y);
            }
        }
Подільність
Задані два натуральних числа a і b. Перевірте, чи ділиться a на b.
Вхідні дані
Два натуральних числа a і b (1 ≤ a, b ≤ 109)
Вихідні дані
Якщо a не ділиться на b без остачі, вивести в одному рядку приватне і залишок від ділення a на b. Інакше вивести "Divisible".
Вхідні дані #1
12 5
Вихідні дані #1
2 2
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int a = int.Parse(massiv[0]);
            int b = int.Parse(massiv[1]);
            if (a % b == 0) Console.WriteLine("Divisible");
            else {
                int o = a % b;
                int s1 = a / b;
                Console.WriteLine(s1 + " " + o);
            }
            }
Cуперечка
Вам пропонується розсудити суперечку Сарумана і Саурона про те, чия армія сильніша. Вважайте, що один орк Сарумана по силі дорівнює 1.5 оркам Саурона.

Вхідні дані
У першому рядку число X - кількість орків в армії Сарумана, у другому рядку Y - кількість орків в армії Саурона (0 ≤ X, Y ≤ 10100).
Вихідні дані
Виведіть "Sauron", якщо армія Саурона сильніше. Якщо ж сильніше армія Сарумана, виведіть "Saruman". У разі нічиєї виведіть "Tie".
static void Main(string[] args)
        {
            BigInteger Saruman = BigInteger.Parse(Console.ReadLine());
            Saruman = Saruman + Saruman / 2;
            BigInteger Sauron = BigInteger.Parse(Console.ReadLine());
            if (Saruman == Sauron) Console.WriteLine("Tie");
            else Console.WriteLine(Saruman < Sauron ? "Sauron" : "Saruman");
        }

Сума непарних чисел

Знайти суму непарних чисел на проміжку від а до b.

Вхідні дані

Два числа a та b, які за модулем не перевищують 109.

Вихідні дані

Сума непарних чисел від а до b.
Вхідні дані #1
2 5
Вихідні дані #1
8
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int a = int.Parse(massiv[0]);
            long b = long.Parse(massiv[1]);
            long sum = 0;
            while (a<=b)
                {
                if (a % 2 != 0) sum = sum + a;
                a++;
                }
            Console.WriteLine(sum);
        }
Простий калькулятор
Простий калькулятор може обчислювати такі вирази:
  • num + num
  • num - num
  • num * num
  • num / num
де num - додатнє ціле число, між 1 і 10000 включно.

Знайдіть значення заданого виразу. Символи +, -, * і / позначають операції додавання, віднімання, множення і ділення відповідно. Всі операції цілочисельні, так що "5/3" дорівнює 1.
Вхідні дані
Рядок містить вираз, яке може обчислити простий калькулятор.
Вихідні дані
Виведіть результат заданого виразу.
Вхідні дані #1
3 * 12
Вихідні дані #1
36
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int  a = int.Parse(massiv[0]);
            int b = int.Parse(massiv[2]);
            char c=char.Parse(massiv[1]);
            int x;
            switch (c)
            {
                case '/':  x = a / b; Console.WriteLine(x); break;
                case '*': x = a * b;  Console.WriteLine(x); break;
                case '-': x = a - b; Console.WriteLine(x); break;
                case '+': x = a + b; Console.WriteLine(x); break;
            }          
        }

Зайці в клітках

Усім відомий, так званий, принцип Діріхле, який формулюється наступним чином:
Припустимо, що деяка кількість кроликів розсажена по клітках. Якщо число кроликів більше, ніж число кліток, то хоча б у одній з кліток буде більше одного кролика.
У даній задачі ми розглянемо більш загальний випадок цього класичного математичного факту. Нехай є n кліток і m зайців, яких розсадили по цим кліткам. Вам потрібно вирахувати максимальну кількість зайців, яка гарантовано опиниться в одній клітці.

Вхідні дані

В одному рядку записано два натуральних числа n і m (1 ≤ nm ≤ 109).

Вихідні дані

Максимальна кількість зайців, яка гарантовано опиниться в одній клітці.
Вхідні дані #1
2 3
Вихідні дані #1
2
Максимальна кількість зайців, які гарантовано опиняться в одній клітці, = (m + n – 1) / n.
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int n = int.Parse(massiv[0]);
            int m = int.Parse(massiv[1]);
            int r = (m + n - 1) / n;
            Console.WriteLine(r);
        }