програмування в С++
10_04_2013 Динамічне програмування |
Добавил(а) Administrator | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30.05.13 15:12 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Задача 4 «Зернинки» Задача 5. Банкомат Задачі 6. Купування квитків
Задача 4 «Зернинки» Мишка збирає зернинки на шаховій дошці. Може рухатись вниз та вліво. Зібрати найбільше зернинок.
=МАКС(C3+M3;C3+N2)
Час на тест - 30 секунд. У деякій державі в обігу знаходяться банкноти певних номіналів. Національний банк хоче, щоб банкомат видавав будь-яку запитану суму за допомогою мінімального числа банкнот, вважаючи, що запас банкнот кожного номіналу необмежений. Допоможіть Національному банку вирішити цю задачу. Формат вхідних даних Перший рядок вхідних даних містить натуральне число n, 0 <n <= 100. Другий рядок вхідних даних містить n різних натуральних чисел x1, x2, ..., xn, не переважаючих 1.000.000. Третій рядок містить натуральне число S, не перевершує 5.000.000. Формат вихідних даних Програма повинна знайти представлення числа S у вигляді суми доданків з множини {xi}, що містить мінімальне число доданків і вивести це подання на екран (у вигляді послідовності чисел, розділених пробілами). Якщо таких уявлень існує декілька, то програма повинна вивести будь-яке (одне) з них. Якщо таке подання не існує, то програма повинна вивести слово impossible. Приклад Вхідні дані 5 1 3 7 12 32 40 Вихідні дані 1 7 32 Вхідні дані 5 10 50 100 500 1000 99 Вихідні дані Impossible
Задачі 6. Купування квитків
За квитками на прем'єру нового мюзиклу вишикувалася черга з N людей, кожний з яких хоче купити 1 квиток. На всю чергу працювала тільки одна каса, тому продаж квитків йшов дуже повільно, приводячи людей черги у відчай. Найкмітливіші швидко відмітили, що, як правило, декілька квитків в одні руки касир продає швидше, ніж коли ці ж квитки продаються поодинці. Тому вони запропонували декільком людям, які стоять підряд віддавати гроші першому з них, щоб він купив квитки на всіх. Проте для боротьби із спекулянтами касир продавала не більше 3-х квитків в одні руки, тому домовитися таким чином між собою могли лише 2 або 3 підряд вартих людини. Відомо, що на продаж i-ій людині з черги одного квитка касир витрачає Ai секунд, на продаж двох квитків - Bi секунд, трьох квитків - Ci секунд. Напишіть програму, яка підрахує мінімальний час, за який могли бути продані квитки для всіх людей черги. Зверніть увагу, що квитки на групу людей, що об'єдналися, завжди купує перший з них. Також ніхто в цілях прискорення не купує зайвих квитків (тобто квитків, які нікому не потрібні). Формат вхідних даних У вхідному файлі записано спочатку число N - кількість покупців в черзі (1<=N<=5000). Далі йде N трійок натуральних чисел Ai, Bi, Ci. Кожне з цих чисел не перевищує 3600. Люди в черзі нумеруються починаючи від каси. Формат вихідних даних У вихідний файл виведіть одне число - мінімальний час в секундах, за яке могли бути обслужені всі покупці. Приклади
N=5
D[i]= min ( D[i-1]+Ai, D[i-2]+ Bi-1, D[i-3]+ Ci-2 )
d[0]= 0; d[1]= а[1]; d[2]= min(а[1]+a[2], b[1]); for (i=3;i<=n;i++) d[i]= min( d[i-1]+ а[i], min( d[i-2]+ b[i-1], d[i-3]+ c[i-2])); |