Шановні учасники форуму! Скоро районна олімпіада по інформатиці. Допоможіть мені та іншим вчителям інформатикам, які погано розуміються на задачах олімпіадного рівня, підвищити свої знання в області програмування.
Увага! При публікуванні розв’язку обов’язково, окрім самої паскаль-програми писати математичну модель задачі і роз’яснювати ваш розв’язок максимально зрозуміло. Бо із самого тексту програм, не завжди все зрозуміло для пересічного інформатика.
[admin]Шановні форумчани!!!!! Повідомлення, які не відповідають темі або несуть некорисний зміст будуть видалятись без попередження!!![/admin]
Шановні панове, у кого олімпіада відбувалася у два тури, викладіть будь-ласка завдання другого туру. Тому що у деяких областях обмежилися одним туром, але цікаво знати, що було у другому турі!
Задача: Визначити, чи знаходиться дана точка всередині многокутника з числом вершин n Координати вершин многокутника задані у текстовому файлі, де перший рядок - кількість вершин, кожна наступна пара рядків - координати вершини x та у Координати лежать в межах -100..100.
перший рядок - кількість вершин, кожна наступна пара рядків - координати вершини x та у
Ще десь мають задаватися координати шуканої точки.
Таку задачу у 1997 році давали на обласній олімпіаді у Чернівецькій області. Мій учень зробив її графічно на Бейсику. 1. Нормалізував координати вершин та координати шуканої точки під систему координат графічного режиму; 2. Накреслив лініями многокутник; 3. Залив його кольором лінії; 4. Зробив пробу кольору у шуканій точці; 5. Якщо колір дорівнює кольору фігури - то належить, інакше - не належить!
Задачу йому зарахували, але трішки менше чим на максимальний бал.
Цю ж задачу інші учасники розв'язали математично. Вже не пам'ятаю алгоритму. Треба подумати.
Визначити, чи знаходиться дана точка всередині многокутника з числом вершин n
Класична задача. Треба з'ясувати, скільки сторін перетинає відрізок, один кінець якого - дана точка, а інший - гарантовано за межами многокутника. Якщо кількість непарна, то точка знаходиться всередині. Тільки робити треба акуратно, щоб двічі одну точку перетину не порахувати. Якщо відрізок пройде через вершину, то краще взяти інший відрізок.
Класична задача. Треба з'ясувати, скільки сторін перетинає відрізок, один кінець якого - дана точка, а інший - гарантовано за меж многокутника. Якщо кількість непарна, то точка знаходиться всередині. Тільки робити треба акуратно, щоб двічі одну точку перетину не порахувати. Якщо відрізок пройде через вершину, то краще взяти інший відрізок.
Проста ідея, а реалізація вимагає вільного володіння планіметрією. Відповісти, чи перетинаються відрізки, задані координатами кінців, учням не так вже й просто...
Нужно для каждой грани сложить уравнение прямой, проходящнй через две точки. Потом развязывать поочередно системы уравнений каждой грани и прямой, проходящей через точку.
Математика.Укр — Олімпіада з програмування - запрошення до участі Подробнее Запрошуємо Вас, прийняти участь у онлайн-олімпіаді "Програмування для початківців".
Олімпіада проводиться системою дистанційної освіти "Математика.Укр" спільно з кафедрою інформатики і вищої математики Кременчуцького національного університету імені Михайла Остроградського. У олімпіаді планується участь усіх загально-освітніх навчальних закладів України та студентів молодших курсів університетів.
За результатами олімпіади активні учасники отримають електронні сертифікати. Участь у олімпіаді - безкоштовна. Прізвища найбільш успішних учасників будуть оприлюднені на сайті.
Олімпіада не має обмежень у часі - можна записатися для участі та потім розв'язувати задачі у будь який час, зручний для вас. Для виконання олімпіадних завдань використовується мова free pascal.
Для участі в олімпіаді достатньо зареєструватися у системі "Математика.Укр" та записатися на олімпіаду. Якщо бажаєте отримати сертифікат на ваше ім'я, слід вказувати ваші справжні ім'я та прізвище (укр. мовою).
До участі запрошуються: школярі, студенти, викладачі та всі, хто вивчає і цікавиться програмуванням. Участь в олімпіаді дозволить вам перевірити ваші знання, ознайомитися з новими задачами, підвищити свою кваліфікацію, знайти однодумців. Викладачі інформатики зможуть перевірити знання своїх учнів, підготувати їх до участі у міських, районних та обласних олімпіадах та до вступу у вищі навчальні заклади за спеціальностями, пов'язаними з програмуванням. Інформація про учасників, які наберуть найбільшу кількість балів буде офіційно оприлюднена на сайті "Математика.Укр" , що сприятиме підвищенню престижності Вашого навчального закладу. У олімпіаді можуть приймати участь і викладачі інформатики. Оцінювання робіт учасників здійснюється автоматично, що забезпечує об'єктивність. У особливих випадках, роботу розглядає апеляційна комісія.
Більш детальну інформацію про правила участі у олімпіаді Ви отримаєте безпосередньо на сайті у онлайн системі після того, як запишетесь для участі. Після реєстрації на олімпіаду Ви маєте можливість у будь-який час відмовитися від подальшої участі.
Будемо вдячні, якщо Ви повідомите цю інформацію вашим вчителям, учням, колегам та друзям. Після першого етапу онлайн-олімпіади "Програмування для початківців" буде продовження, у тому числі і з використанням інших мов програмування для здачі завдань.
Ваша адреса для цього запрошення отримана із відкритих джерел (сайти шкіл, департаментів освіти та інше) і ви маєте можливість у будь який момент повідомити нас, що це запрошення відправлено вам помилково. Ваші повідомлення надсилайте на офіційну адресу системи дистанційної освіти: osvita@primat.org
З повагою, організатори онлайн олімпіади "Програмування для початківців".
Кто решал эту задачку? В e-olimp выдает 76% Помогите.
Купівля квітів (100 б) На День учителя Вася вирішив купити букет квітів. У магазині продаються ромашки по a рублів за штучку ігладіолуси по b рублів за штучку (a< b).У Васі є c рублів. Він хоче скласти букет з максимально можливої кількості квітів, і при цьому витратити якомога більше грошей. Іншими словами, зі всіх букетів з максимально можливою кількістю квітів він хоче вибрати найдорожчий, але не дорожче c рублів. Допоможіть йому обчислити вартість такого букету. Вхідні дані Три цілі числа a, b, c (1 ≤ a < b ≤ 100, 0 ≤ c ≤ 1000). Вихідні дані Виведіть одне число - вартість найдорожчого букету з максимальної кількості квітів. · Ліміт часу 1 секунда · Ліміт використання пам'яті 64 MiB Вхідні дані #1 2 3 11 Вихідні дані #1 11 Вхідні дані #2 3 5 10 Вихідні дані #2 9
Решение int a, b, c; cin>>a>>b>>c; if (c%a<b-a) cout<<c/a*a; else cout<<c/a*a-a+b;
На День учителя Вася вирішив купити букет квітів. У магазині продаються ромашки по a рублів за штучку ігладіолуси по b рублів за штучку (a< b).У Васі є c рублів. Він хоче скласти букет з максимально можливої кількості квітів, і при цьому витратити якомога більше грошей. Іншими словами, зі всіх букетів з максимально можливою кількістю квітів він хоче вибрати найдорожчий, але не дорожче c рублів. Допоможіть йому обчислити вартість такого букету.Вхідні дані Три цілі числа a, b, c (1 ≤ a < b ≤ 100, 0 ≤ c ≤ 1000). Вихідні дані Виведіть одне число - вартість найдорожчого букету з максимальної кількості квітів.
ЦитатаПилипчук_О_П ()
Остачі від купівлі найдешевших квітів може вистачити на те, щоб обміняти якусь кількість дешевих на дорожчі:
Цитатаswetikccc ()
Дійсно рулить, але не працює коли у нас грошей навіть на одну найдешевшу квіточку зась.
Нужно учесть три фактора: 1) денег у Васи может оказаться меньше, чем стоит самый дешевый цветочек 2) количество возможных обменов дешевых цветов на дорогие может оказаться больше, чем , чем дешевых цветков в букете 3) "День учителя" не траурный праздник, а значит цветов в букете должно быть нечетное количество.
Идеальным было бы такое решение: #include <iostream> using namespace std; int main() { int a,b,c,n,res; cin >> a >> b >> c;
n=c/a;
if (n==0) res = 0; else if (n%2!=0) res = n*a + min(n,c%a / (b-a)) * (b-a); else res = (n-1)*a + min((n-1),(c%a+a)/(b-a))*(b-a);
cout << res ;
return 0; }
Но, к сожалению, автор задачи, считает, что на День учителя можно дарить и четное количество цветов (и где-то он прав ) Поэтому 100% решением задачи "Купівля квитків" будет следующий код: #include <iostream> using namespace std; int main() { int a,b,c,n,res; cin >> a >> b >> c;
n=c/a;
if (n==0) res = 0; else res = n*a + min(n,c%a / (b-a)) * (b-a);
cout << res ;
return 0; }
Вот Вам и задачи из технологий, для которых математика "не нужна". :)