Перекласти

Задача В

Задача B. Рада школи
Ім’я вхідного файлу: іnput.txt
Ім’я вхідного файлу: output.txt
Ліміт часу: 1 с.
До керівництва ради школи входять батьки, учні та вчителі, причому батьків повинно бути не менше 1/3 від загальної кількості членів ради. На поточний момент часу до ради школи входить N людей, з них K батьків. Визначте, скільки батьків потрібно додатково ввести в число ради школи, щоб їх кількість була не меншою 1/3 від загального числа всіх учасників.
 Вхідні дані
Вхідні дані містять два числа N і K (N › 0, 0 ≤ K ≤ N≤100000) записані через пропуск.
Вихідні дані
Вихідні дані містять одне число - мінімальна кількість батьків, яких потрібно долучити до числа ради школи.
Приклад
іnput.txt
output.txt
27 7
3

Ідея: задача нескладна у реалізації, але спочатку треба скласти нерівність, яку слід перевірити в програмі.

Складемо рівняння кількості людей: учні_вчителі + батьки + додаткові_батьки = всі,
або в математичних позначеннях  n-k + k +Dk = Z.
Згідно умови задачі має виконуватись нерівність:
батьки_наявні+додаткові_батьки не перевищують 1/3 всіх_осіб_в-раді,
або в математичних позначеннях  k +Dk ³ 1/3 Z.
Якщо з рівняння підставити вираз у нерівність  замість Z (позбуваємось невідомих змінних), тоді
k +Dk ³ 1/3 (n-k + k +Dk).
Отримане рівняння потрібно спростити, а також позбутись ділення (домножити на «3» ліву та праві частини:  задача вимагає точного розв’язку, а дріб в результаті ділення 1 на 3 для цілих чисел перетвориться на 0 і перетворить всю ліву частину нерівності на 0, що не дасть змоги розв’язати задачу).
 Отже:
3k +3Dk ³ n +Dk   Þ   2Dk ³ n - 3k     – за такої умови існує відповідь. Щоб знайти  Dk слід виконати алгоритм:
почати з Dk=1;
поки (2Dk < n -3k) збільшити Dk на 1.
Коли 2Dk < n -3k перестане виконуватись, тоді це означатиме, що ми «добрались» до такого  Dk, що виконується 2Dk ³ n -3k , тобто відповідь знайдена.

#include <stdio.h>

//----------------------------------------
int main()
{
       freopen("input.txt", "r", stdin);
       freopen("output.txt", "w", stdout);
       int k, n;
       scanf("%d%d", &n, &k);

       int deltaK = 1;
       while(2*deltaK<n-3*k)
             deltaK++;

       printf("%d\n", deltaK);

       return 0;
}


Немає коментарів:

Дописати коментар