четверг, 21 июня 2018 г.

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


Степінь

Для натуральних чисел a та n обчислити an.

Вхідні дані

Два числа a та n (1 ≤ a ≤ 91 ≤ n ≤ 7000).

Вихідні дані

Вивести результат без ведучих попереду нулів та зайвих пропусків.
static void Main(string[] args)
        {
            string setir = Console.ReadLine();
            var massiv = setir.Split(' ');
            int a = int.Parse(massiv[0]);
            int n = int.Parse(massiv[1]);
            Console.WriteLine(BigInteger.Pow(a, n));
        }

Ті, що діляться на 6

Для N цілих чисел визначити суму й кількість додатніх чисел, які діляться на 6 без остачі.
Вхідні дані
У першому рядку задано кількість чисел N (0 < N ≤ 100), у наступному рядку через пропуск задано самі числа, значення яких по модулю не перевищують 10000.
Вихідні дані
У єдиному рядку виведіть спочатку кількість вказаних чисел і через пропуск їх суму.
Вхідні дані
3
12 15 18
Вихідні дані
2 30
static void Main(string[] args)
        {
            string st = Console.ReadLine();
            var massiv = st.Split(' ');
            int n = int.Parse(massiv[0]);
            string st1 = Console.ReadLine();
            var massiv1 = st1.Split(' ');
            int k = 0, s = 0; int t;
            for (int i = 0; i < n; i++)
            {

                t = int.Parse(massiv1[i]);
                if ((t>0) && (t%6==0))
                {
                    k++;
                    s = s + t;
                }               
            }
            Console.WriteLine(k + " " + s);
        }
Рівень навчальних досягнень
Встановити рівень навчальних досягнень учня (початковий, середній, достатній, високий) відповідно до заданої оцінки (від 1 до 12).
Вхідні дані
Одне число - бал учня.
Вихідні дані
Вивести Initial для початкового рівня (оцінка від 1 до 3), Average для середнього (оцінка від 4 до 6), Sufficient для достатнього (оцінка від 7до 9) і High для високого (оцінка від 10 до 12).
Вхідні дані #1
12
Вихідні дані #1
High
        static void Main(string[] args)
        {
            int q = int.Parse(Console.ReadLine());
            if ((q == 1) || (q == 2) || (q == 3)) Console.WriteLine("Initial");
            if ((q == 4) || (q == 5) || (q == 6)) Console.WriteLine("Average");
            if ((q == 7) || (q == 8) || (q == 9)) Console.WriteLine("Sufficient");
            if ((q == 10) || (q == 11) || (q == 12)) Console.WriteLine("High");
        }
Генерація строк Фібоначчі
Сгенеруйте n-у строку Фібоначчі, яка визначається наступною рекурентною формулою:
f (0) = "a";
f (1) = "b";
f (n) = f (n - 1) + f (n - 2), де операція "+" означає конкатенацію
Наприклад, f (3) = f (2) + f (1) = (f (1) + f (0)) + f (1) = "b" + "a" + "b" = "bab".
Вхідні дані
Одне ціле число n (0 ≤ n ≤ 20).
Вихідні дані
Виведіть n-у строку Фібоначчі.
Вхідні дані #2
5
Вихідні дані #2
babbabab
public static string f(int n)
        {
            if (n == 0) return "a";
            if (n == 1) return "b";
            return f(n - 1) + f(n - 2);
        }
        static void Main(string[] args)
        {            
            int t = int.Parse(Console.ReadLine());
            Console.WriteLine(f(t));
        }
Аналіз алгоритма
Реалізуємо рекурсивну функцію, яка генерує n-ий рядок Фібоначчі.
Читаємо вхідні дані.
Читаємо значення n і виводимо n-й рядок Фібоначчі.

Перша цифра числа

Знайти першу цифру цілого числа. Відлік починати з найвищого розряду.

Вхідні дані

Одне ціле 64 - розрядне число, що містить не менше однієї цифри. Число може бути від'ємним.

Вихідні дані

Виведіть першу цифру заданого числа.
Вхідні дані #1
1234567890123
Вихідні дані #1
1
аналіз алгоритму
Якщо число від'ємне, то поміняємо його знак, зробивши його позитивним - від цього перша цифра не зміниться. Розподіл на 10 прибираємо останню цифру числа. Ділимо число на 10 до тих пір, поки не залишиться в ньому одна цифра - це і буде перша цифра вихідного числа.
Реалізація алгоритму
Читаємо ціле число n.
Якщо число від'ємне, то зробимо його додатнім.
Ділимо число на 10, поки воно не буде містити тільки першу цифру.
Виводимо першу цифру числа.
static void Main(string[] args)
        {           
            long n = long.Parse(Console.ReadLine());
            if (n < 0) n = -n;
            while (n > 9) n /= 10;
            Console.WriteLine(n);
        }
Лінивий Мишко
Мишко домовився з хлопцями пограти у футбол і вже зібрався виходити з хати, але тут його спіймала мама і сказала, що доки Міша не допоможе їй з домашньою роботою, на футбол він не піде. На вибір мама запропонувала Мишку виконату одну з трьох справ: або вимити посуд, або пропилесосити квартиру, або погратись з молодшою сестричкою Маринкою, поки мама сходить у магазин. Мишко прикинув, скільки часу займе кожна справа:
·                     На миття посуду піде t1 секунд
·                     Пропилесосити квартиру можна за t2 секунд
·                     Процес гри з Маринкою займе t3 секунд
Зрозуміло, что Мишко вибере ту справу, яка займе мінімум часу. Ваша програма повинна вивести час, протягом якого Мишко буде виконувати мамине завдання.
Вхідні дані
Три цілих числа t1, t2, t3 (1 ≤ t1, t2, t3 ≤ 1000).
Вихідні дані
Вивести мінімальний час, який знадобиться Мишку для виконання маминого завдання.
Вхідні дані #1
31 15 40
Вихідні дані #1
15
static void Main(string[] args)
        {
            string st = Console.ReadLine();
            var massiv = st.Split(' ');
            int t1 = int.Parse(massiv[0]);
            int t2 = int.Parse(massiv[1]);
            int t3 = int.Parse(massiv[2]);
            int  min = t1;
            if (t2 < min) min = t2;
            if (t3 < min) min = t3;
            Console.WriteLine(min);
        }
Банкомат
Банкомат містить в достатній кількості купюри номіналом 10, 20, 50, 100, 200 і 500 гривень. Знайти найменшу кількість купюр, якою можна видати суму в n гривень, або вивести -1, якщо вказану суму видати не можна.
Вхідні дані
Одне число n (1n1000000).
Вихідні дані
Найменша кількість купюр, якою можна видати n гривень.
Вхідні дані
770
Вихідні дані
4
static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int sum = 0;
            int[] eskinazlar = { 500, 200, 100, 50, 20, 10 };
            foreach (var c in eskinazlar)
            {
                int cnt = n / c;
                n = n - cnt * c;
                sum = sum + cnt;
            }
            if (n == 0) Console.WriteLine(sum);
            else Console.WriteLine("-1");
     }
Сума парних цифр
Дано довге число. Знайти суму його парних цифр.
Вхідні дані
Одне натуральне число n
Вихідні дані
Вивести суму парних цифр числа n.
Вхідні дані #1
2345
Вихідні дані #1
6
Алгоритм рішення задачі:

Присвоїти змінної sum значення 0.
Поки значення n більше нуля виконувати пункти 4 і 5.
Витягувати останню цифру числа (шляхом знаходження залишку від ділення на 10) і перевіряти її на парність (шляхом знаходження залишку від ділення на 2).
Якщо цифра парна, то додавати її до sum.
Позбутися від останньої цифри числа шляхом її поділу без остачі на 10.
Вивести значення sum на екран.
static void Main(string[] args)
        {
            BigInteger n = BigInteger.Parse(Console.ReadLine());
            BigInteger s = 0;
            while (n>0)
            {
                if (n % 10 % 2 == 0)
                    s = s + n % 10;
                n = n / 10;
            }
             Console.WriteLine(s);
        }

У хокей грають справжні...

Лісові жителі вирішили провести хокейний турнір між N командами. Скількома способами можуть бути розподілені комплекти золотих, срібних та бронзових медалей, якщо одне призове місце може зайняти лише одна команда?
Вхідні дані
У єдиному рядку розміщено єдине натуральне число N, яке не перевищує 100.
Вихідні дані
Єдине число - шукана кількість способів.
Вхідні дані
17
Вихідні дані
4080
Якщо за правилами тільки одна команда може отримати золото, одна - срібло і одна - бронзу, тоді:
Число варіантів = N * (N-1) * (N-2)
У командних змаганнях кожен член команди отримує медаль. Тому і говорять про комплект медалей для першого, другого, ... місця.
static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            if (n < 3) Console.WriteLine(n);
            else Console.WriteLine(n * (n - 1) * (n - 2));
 }