вторник, 21 ноября 2017 г.

С# Олімпіадні задачі

Послідовність Фібоначчі
Послідовність Фібоначчі задано так:
  • a0 = 0
  • a1 = 1
  • ak = ak-1 + ak-2
Для заданого n знайти значення n-го елемента an послідовності Фібоначчі.
Вхідні дані
Єдине натуральне число N (1 ≤ N ≤ 40).
Вихідні дані
N-ий елемент послідовності Фібоначчі.
Вхідні дані
Sample 1
2

Sample 2
5

Sample 3
8
Вихідні дані
Sample 1
1

Sample 2
5

Sample 3
21

static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int[] fib = new int[n + 1];
            fib[0] = 0;
            fib[1] = 1;
            for (int i = 2; i <= n; i++)
            {
                fib[i] = fib[i - 1] + fib[i - 2];
            }
            Console.WriteLine(fib[n]);
        }

Точка і прямокутник

Визначте, чи належить точка (XY) прямокутнику з кінцями діагоналі (X1Y1X2Y2) і сторонами, паралельними координатним осям?

Вхідні дані

Шість дійсних чисел XYX1Y1X2Y2 - координати точки та координати кінців діагоналі прямокутника, відповідно. Числові значення по модулю не перевищують 100.

Вихідні дані

Вивести 1, якщо точка належить прямокутнику, або 0, якщо ні.
Вхідні дані
1 2 3 4 0 0
Вихідні дані
1
static void Main(string[] args)
        {
            string setir = Console.ReadLine();
            var massiv = setir.Split(' ');
            double x = double.Parse(massiv[0]);
            double y = double.Parse(massiv[1]);
            double x1 = double.Parse(massiv[2]);
            double y1 = double.Parse(massiv[3]);
            double x2 = double.Parse(massiv[4]);
            double y2 = double.Parse(massiv[5]);
            double minX = Math.Min(x1, x2);
            double minY = Math.Min(y1, y2);
            double maxX = Math.Max(x1, x2);
            double maxY = Math.Max(y1, y2);
            if (minX <= x && x <= maxX && minY <= y && y <= maxY) Console.WriteLine(1);
            else Console.WriteLine(0);
        }

Клітинки в колі

На аркуші паперу в клітинку намальовано коло з радіусом R і з центром на перетині ліній клітинок. Скільки повних клітинок міститься у даному колі.

Вхідні дані

В єдиному рядку записано одне ціле невід'ємне число R - радіус кола. 0 ≤ R ≤ 1000.

Вихідні дані

Одне число - кількість цілих клітинок.
Вхідні дані
2
Вихідні дані
4
static void Main(string[] args)
        {
            double r=double.Parse(Console.ReadLine());
            int answer = 0;
            for (double x = 1; x < r; x = x + 1)
                answer += (int)Math.Sqrt(r * r - x * x);
            answer *= 4;
            Console.WriteLine(answer);
        }
Трикутник
Визначте, чи можна отримати два трикутники з заданими довжинами сторін, розрізавши деякий прямокутник одним розрізом і вільно обертаючи і перевертаючи отримані куски.

Вхідні дані

Cкладається  з двох рядків. Перший рядок містить три натуральних числа - довжини сторони першої трикутника. Друга рядок містить три натуральних числа - довжини сторони другого трикутника. Відомо, що трикутники є коректними. Всі довжини сторін не більше 100.

Вихідні дані

Зведіть, чи існує прямокутник, який можна було б розрізати на трикутники з заданими довжинами сторін. Якщо такий прямокуник існує, виведіть ТАК. В противному випадку виведіть НІ.

Пусть a, b, c – длины сторон первого треугольника, d, e, f – длины сторон второго треугольника. Отсортируем стороны треугольников так чтобы выполнялись неравенства abc и def. Из двух треугольников можно сложить прямоугольник только если их соответствующие стороны попарно равны (a = d, b = e, c = f) и если оба треугольника являются прямоугольными (a2 + b2 = c2, d2 + e2 = f2).
  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]);
            int c = int.Parse(massiv[2]);
            string ss = Console.ReadLine();
            var massiv1 = ss.Split(' ');
            int d = int.Parse(massiv1[0]);
            int e = int.Parse(massiv1[1]);
            int f = int.Parse(massiv1[2]);
            int t;
            if (a > c) { t = a; a = c; c = t; }

            if (b > c) { t = b; b = c; c = t; }
            if (a > b) { t = a; a = b; b = t; }
            if (d > f)  {t = d; d = f; f = t; }
            if (e > f)  {t = e; e = f; f = t; }
            if (d > e)  {t = d; d = e; e = t; }
            Console.WriteLine((a == d && b == e && c == f && a * a + b * b == c * c ? "YES\n" : "NO\n"));
            Console.ReadKey(true);
        }

Довжина вектора

Обчислити довжину вектора.

Вхідні дані

Чотири цілих числа x1y1x2y2 - координати початку та кінця вектора відповідно. Усі вхідні числа не перевищують за модулем 10000.

Вихідні дані

Одне число - довжина заданого вектора з точністю до шести десяткових знаків.
Вхідні дані
1 1 2 2
Вихідні дані
1.414214
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int x1 = int.Parse(massiv[0]);
            int y1 = int.Parse(massiv[1]);
            int x2 = int.Parse(massiv[2]);
            int y2 = int.Parse(massiv[3]);
            double d = Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2));
            Console.WriteLine("{0:#.######}", d);          
        }

Належність точки променю

Визначте, чи належить задана точка променю.

Вхідні дані

Містить шість цілих чисел - координати точки та коррдинати початку та кінця вектора. Усі числа не перевищують за модулем 10000.

Вихідні дані

Вивести YES, якщо точка належить променю та NO у протилежному випадку.
Вхідні дані #1
1 6 3 7 5 8
Вихідні дані #1
NO
        static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int x0 = int.Parse(massiv[0]);
            int y0 = int.Parse(massiv[1]);
            int x1 = int.Parse(massiv[2]);
            int y1 = int.Parse(massiv[3]);
            int x2 = int.Parse(massiv[4]);
            int y2 = int.Parse(massiv[5]);
            if ((x0 - x1) * (y2 - y1) == (x2 - x1) * (y0 - y1) &&
+(x0 - x1) * (x2 - x1) >= 0 && (y0 - y1) * (y2 - y1) >= 0) Console.WriteLine("YES\n");
            else Console.WriteLine("NO\n");
        }

Точка всередині круга

Перевірити, чи знаходиться точка всередині круга.

Вхідні дані

У першому рядку задано координати центра круга та його радіус. У другому рядку задано координати точки A. Усі числа цілі, не перевищують за модулем 1000.

Вихідні дані

Вивести "YES", якщо точка A належить кругу (з границями), і "NO" інакше.
Вхідні дані #1
2 1 2
1 3
Вихідні дані #1
NO
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int x0 = int.Parse(massiv[0]);
            int y0 = int.Parse(massiv[1]);
            int r = int.Parse(massiv[2]);
            string ss = Console.ReadLine();
            var massiv1 = ss.Split(' ');
            int x = int.Parse(massiv1[0]);
            int y = int.Parse(massiv1[1]);
            if ((x - x0) * (x - x0) + (y - y0) * (y - y0) <= r * r)
            Console.WriteLine("YES\n");
            else Console.WriteLine("NO\n");
        }

Віднімання

Знайти різницю двох цілих невід`ємних чисел A та B.
Вхідні дані
У вхідному файлі задано два цілих невід`ємних числа A та B (B ≤ A ≤ 1010000), кожне у своєму рядку.
Вихідні дані
У вихідний файл виведіть одне число, яке дорівнює різниці A та B.
Вхідні дані
5
3
Вихідні дані
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            BigInteger a = BigInteger.Parse(massiv[0]);
            string ss = Console.ReadLine();
            var massiv1 = ss.Split(' ');
            BigInteger b = BigInteger.Parse(massiv1[0]);
Console.WriteLine(a-b);
        }

Порівняння

Порівняйте два числа A та B.
Вхідні дані
У вхідному файлі задано два цілих невід`ємних числа A та B (AB <= 1010000) кожне у своєму рядку.
Вихідні дані
У вихідний файл виведіть "<", якщо A < B, "=", якщо A = B та ">", якщо A > B.
Вхідні дані
2
1
Вихідні дані
> 

 

Належність точки відрізку

Визначити, чи належить задана точка відрізку.

Вхідні дані

Шість цілих чисел - координати точки і координати початку і кінця відрізку. Усі числа не перевищують за модулем 10000.

Вихідні дані

Вивести "YES", якщо точка належить відрізку, і "NO" у протилежному випадку.
Вхідні дані #1
3 3 1 2 5 4
Вихідні дані #1
YES
Вхідні дані #2
3 3 1 2 5 3
Вихідні дані #2
NO
        static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int x = int.Parse(massiv[0]);
            int y = int.Parse(massiv[1]);
            int x1 = int.Parse(massiv[2]);
            int y1 = int.Parse(massiv[3]);
            int x2 = int.Parse(massiv[4]);
            int y2 = int.Parse(massiv[5]);
            double l1, l2,l3;
            l1 = Math.Sqrt(Math.Pow((x1 - x), 2) + Math.Pow((y1 - y), 2));
            l2 = Math.Sqrt(Math.Pow((x2 - x), 2) + Math.Pow((y2 - y), 2));
            l3 = Math.Sqrt(Math.Pow((x2 - x1), 2) + Math.Pow((y2 - y1), 2));
            if (l3 == 0) Console.WriteLine("NO");
            else
            {
                if (l3 == (l1 + l2)) Console.WriteLine("YES");
                else
                    Console.WriteLine("NO");
            }
          
            // Console.ReadLine();
        }

Гармата

У початку координат встановлено гармату, яка стріляє кульками для пінг-понгу. На деякій відстані R від неї, паралельно осі ОХ, знаходиться цегляна стінка нескінченної довжини. Між стінкою і віссю OX розміщено точкову ціль з координатами (X,Y). Потрібно націлити гармату так, щоб кулька вдарилася спочатку об стінку, а потім попала в ціль. Визначіть найкоротшу відстань від осі OY до точки удару кульки в стінку.
Вхідні дані
Перший рядок містить кількість тестів. Для кожного тесту в окремому рядку міститься три цілих числа RX та Y (-10<=X<=100<=Y<R<=10), відокремлених пропусками.
Вихідні дані
Для кожного тесту в окремому рядку вивести відстань по прямій лінії від осі OY до точки удару кульки в стіну з точністю до двох знаків після коми.

Вхідні дані
2
10 5 5
10 10 5
Вихідні дані
3.33
6.67
static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            for (int i = 0; i < n; i++)
            {
                string s = Console.ReadLine();
                var massiv = s.Split(' ');
                double r = double.Parse(massiv[0]);
                double x = double.Parse(massiv[1]);
                double y = double.Parse(massiv[2]);
                if (x < 0) x = -x;
                Console.WriteLine("{0:N2}", r * x / (2 * r - y));
            }
        }

Йо-йо

Іграшка йо-йо складається з катушки, на яку намотано нитку. Якщо, тримаючи за кінець нитки, відпустити катушку, то вона буде, обертаючись, спочатку опускатись донизу, а потім за інерцією підніматись вверх. Але висота, на яку катушка підніметься, буде в k раз меншою, ніж висота, з якої вона опустилась. Будемо вважати, що катушка зупинилась, якщо висота її чергового підйому не перевищує 1.
Напишіть програму, яка за довжиною нитки l та коефіцієнту k рахує кількість підйомів катушки до зупинки. Наприклад, нехай 172, тоді катушка буде підніматись на висоти 8.54.252.1251.0625, а потім зупиниться. Таким чином будемо мати 4 підйоми.
Вхідні дані
Два цілих числа l (1  ≤l ≤  109) та k (2  ≤  k ≤  100).
Вихідні дані
Вивести одне число – кількість підйомів.
Вхідні дані #1
17 2
Вихідні дані #1
4
static void Main(string[] args)
        {
            string w = Console.ReadLine();
            var massiv = w.Split(' ');
            double l = double.Parse(massiv[0]);
            int k = int.Parse(massiv[1]);
            int s = 0;
            l = l / k;
            while (l > 1)
            {
                s++;
                l = l / k;
            }
            Console.WriteLine(s);       
        }

Кодування

Послідовність бітів кодується наступним чином. Якщо значення попереднього біта заданої послідовності відрізняється від значення поточного біта, що кодується, в результуючу послідовність записується 1. Якщо значення бітів не відрізняються, то записується 0. Для першого біта послідовності попереднім є біт зі значенням 0.
Напишіть програму, яка виконує кодування.
Вхідні дані
Вводиться рядок довжиною не більше 100 символів, який складається лише з 0 і 1, який представляє собою кодовану послідовність бітів.
Вихідні дані
Вивести результат кодування.
Вхідні дані
10010111
Вихідні дані
11011100
  static void Main(string[] args)
        {
            string s = Console.ReadLine();
            int len = s.Length;
            string c = s[0] == '0' ? "0" : "1";
            for (int i = 1; i < len; i++)
            {
                c = (s[i] == s[i - 1]) ? c + "0" : c + "1";
            }
            Console.WriteLine(c);
        }

Угадай число

Боб и его старший брат Альберт часто играют в игру "Угадай число". Сначала Боб загадывает число K в диапазоне от 1 до N. Потом Альберт называет числа, а Боб говорит, является названное число больше или меньше загаданного или Альберт назвал правильное число. Альберт для угадывания всегда использует следующую стратегию.
1 шаг. Альберт задает A=1 и B=N
2 шаг. Альберт вычисляет M – целую часть среднего арифметического чисел A и B
3 шаг. Альберт называет число M
4 шаг. Если Боб говорит "Меньше", то Альберт полагает A=M+1 и переходит к шагу 2
5 шаг. Если Боб говорит "Больше", то Альберт полагает B=M1 и переходит к шагу 2
6 шаг. Если Боб говорит "Угадал", то игра заканчивается
Например, пусть N=9, а задуманное Бобом число K равно 6. Сначала A=1B=9. Альберт называет число 5 и получает ответ "Меньше". Теперь A=6B=9. Следующее число-попытка 7. Боб отвечает "Больше". Теперь A=6B=6. Альберт называет 6 и получает ответ "Угадал".
Напишите программу, которая определяет, сколько чисел придется назвать Альберту, прежде чем он получит ответ "Угадал" от Боба.
Входные данные
В первой строке входного файла содержатся два целых числа N (1  ≤  N ≤  1000) и K (1  ≤  K ≤  N), разделенных пробелом.
Выходные данные
В выходной файл вывести одно целое число – количество названных Альбертом чисел до получения ответа Боба "Угадал".
Вхідні дані
9 6
Вихідні дані
3
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 a = 1;
            int b = n;
            int q = 1;
            int m = (a + b) / 2;
            while (m != k)
            {
                if (m > k) b = m - 1;
                else a = m + 1;
                m = (a + b) / 2;
                q++;
            }
            Console.WriteLine(q);
        }

Поставка содової води

Тім дуже полюбляє содову воду, іннколи він нею ніяк не може напитися. Ще більш прикрим є той факт, що у нього постійно бракує грошей. Тому єдиним легальним способом їх отримання є продаж порожніх пляшок з-під соди. Іноді на додаток до його особисто випитих пляшок додаються ті, які Тім іноді знаходить на вулиці. Одного дня Тіма настільки замучила спрага, що він вирішив пити до тих пір поки міг собі це дозволити.
Вхідні дані
Три целі невід'ємні числа efc, де e (e < 1000) - кількість порожніх пляшок, які є у Тіма на початку дня, f (f < 1000) - кількість порожніх пляшок, знайдених протягом дня, і c (1 < c < 2000) - кількість порожніх пляшок, необхідних для покупки нової пляшки.
Вихідні дані
Скільки пляшок содової води зможе випити Тім, коли його замучила спрага?
Вхідні дані #1
9 0 3
Вихідні дані #1
4
static void Main(string[] args)
        {
            string s = Console.ReadLine();
            var massiv = s.Split(' ');
            int e = int.Parse(massiv[0]);
            int f = int.Parse(massiv[1]);
            int c = int.Parse(massiv[2]);
            int k = 0;
            e = e + f;
            while (c <= e)
            {
                int n = e / c;
                e = n + e % c;
                k = k + n;
            }
            Console.WriteLine(k);
        }

Задача A + B

Знайдіть A + B.
Вхідні дані
У кожному рядку задано два цілих числа A та B (|A|, |B| ≤ 30000). Дані зчитуйте до кінця файлу.
Вихідні дані
Для кожного наведеного прикладу виведіть суму A + B у окремому рядку.
Вхідні дані #1
1 1
1 2
Вихідні дані #1
2
3
static void Main(string[] args)
        {
            string s = "";
            while ((s = Console.ReadLine()) != null)
            {
                var massiv = s.Split(' ');
                int a = int.Parse(massiv[0]);
                int b = int.Parse(massiv[1]);
                Console.WriteLine(a + b);
            }
            }

Кількість операцій

Визначити загальну кількість операцій додавання (+), віднімання (-) та множення (*) у заданому арифметичному виразі.

Вхідні дані

У єдиному рядку задано арифметичний вираз без дужок та пропусків. Кількість символів у виразі не перевищує 250.

Вихідні дані

Вивести кількість вказаних операцій.
Вхідні дані #1
-1+2*3+a
Вихідні дані #1
3
  static void Main(string[] args)
        {
            string s = Console.ReadLine();
            s = s.TrimStart('-');
            s = s.TrimStart('+');
            int len = s.Length;
            int k = 0;
            for (int i = 0; i < len; i++)
            {
                if ((s[i] == '+') || (s[i] == '-') || (s[i] == '*')) k++;
            }
            Console.WriteLine(k);

        }

Комментариев нет:

Отправить комментарий