Масив монет і запити зважування
Це інтерактивна задача.
Є монет, розташованих в ряд та пронумерованих зліва направо цілими числами від до .
Рівно () з цих монет є фальшивими, інші монет — справжні. Фальшиві монети легші за справжні. Всі справжні монети мають однакову вагу, в той час як фальшиві монети можуть мати різну вагу. Також відомо, що фальшиві монети розташовані поспіль, тобто мають номери .
Вам потрібно знайти номер найлівішої фальшивої монети. Ви можете користуватись зважуванням, що аналогічне зважуванню на двочашкових терезах: вибрати дві множини монет, що не перетинаються, і дізнатись, яка з множин важить більше, або що множини важать однаково.
Вхідні дані
У першому рядку задано три цілі числа , , (, ) — загальна кількість монет, кількість фальшивих монет та номер блоку тестів відповідно.
Протокол взаємодії
Щоб виконати запит зважування виведіть «?
», де та позначають розміри множин які зважуються, а масиви та позначають номери монет, що належать першій та другій множинам відповідно.
У відповідь на запит програма журі виведе одне ціле число (). Якщо , то перша множина важча за другу; якщо , то друга множина важча за першу; якщо , то множини мають однакову вагу.
Якщо запит невалідний (тобто перевищено максимальну кількість запитів або параметри запиту є невалідними), програма журі виведе -1
та припинить роботу. У такому випадку завершіть роботу програми, щоб отримати вердикт Неправильна відповідь
.
Подбайте про виклик методу flush
після виводу кожного рядка. Для цього можна використовувати:
fflush(stdout)
,cout << endl
абоcout.flush()
вC++
;System.out.flush()
вJava
;flush(output)
вPascal
;sys.stdout.flush()
вPython
;дивіться документації для інших мов програмування.
Вихідні дані
Для того, щоб дати відповідь, виведіть єдиний рядок у форматі «!
», де () — номер найлівішої фальшивої монети.
Приклади
4 1 0 0 0 2
? 1 1 1 2 ? 1 1 2 4 ? 1 1 3 4 ! 3
Оцінювання
Визначимо як максимальну кількість запитів зважування, яку ви можете виконати у тестах певного блоку.
( балів): , ;
( балів): , ;
( балів): , ;
( балів): , ;
( балів): ваги всіх фальшивих монет однакові, ;
(до балів): . Нехай максимальна кількість використаних зважувань дорівнює . Якщо , то ви отримаєте бали, а інакше ви отримаєте балів.
Код на мові C++
, який обчислює кількість балів за останній блок тестів залежно від кількості використаних зважувань:
((c <= 9) ? 54 : int(54 * (max((-0.0004 * c + 0.3134), (0.018 + 9.0773 / c)))))
Таблиця розподілу балів
Кількість балів | Кількість балів | Кількість балів | |||
- | |||||
- | |||||
- | |||||
- | |||||
- | |||||
- | |||||
- | |||||
- | - | ||||