Автор: | Г. Гренкин | Ограничение времени: | 1 сек | |
Входной файл: | input.txt | Ограничение памяти: | 256 Мб | |
Выходной файл: | output.txt |
По мотивам романа И.А. Ильфа и Е.П. Петрова "Двенадцать стульев".
Для окраски волос Ипполит Матвеевич Воробьянинов купил в аптеке замечательное средство "Титаник" радикального черного цвета. Возвратившись домой, Ипполит Матвеевич стал поливать голову и усы "Титаником".
После обеда усы обсохли, слиплись, и расчесать их можно было только с большим трудом. Радикальный черный цвет оказался с несколько зеленоватым отливом...
Проснувшись на другой день, Ипполит Матвеевич стал умываться. Но, посмотрев в зеркало, он обнаружил, что его усы и волосы были зелёного цвета.
Его компаньон Остап Бендер купил в аптеке другую микстуру "Наяда". Но после перекраски оказалось, что, смешавшись с зеленью "Титаника", это средство неожиданно окрасило голову и усы Ипполита Матвеевича в краски солнечного спектра. После скептического осмотра Остап предложил Воробьянинову сбрить усы и волосы.
Всё могло бы быть иначе, если бы концессионеры точно рассчитали цвет второго флакона. Посмотрим, как можно это сделать.
Наряду с аддитивной цветовой моделью RGB, используемой для кодирования цветов пикселей экрана, существует и субтрактивная модель RYB, которая применяется для представления цвета в изобразительном искусстве. Для задания цвета в этой модели нужно указать количество красного, желтого и синего цвета как число от 0 до 1. Так, 100 — это красный цвет, 001 — синий, 111 — чёрный, а 110 — оранжевый.
Модель RYB позволяет легко найти цвет смеси двух красок. При смешивании цветов (r1, y1, b1) и (r2, y2, b2) получается цвет (r3, y3, b3), где r3 = (r1 + r2) / k, y3 = (y1 + y2) / k, b3 = (b1 + b2) / k. Здесь k = max{r1 + r2, y1 + y2, b1 + b2}.
Даны цвета (r1, y1, b1) и (r3, y3, b3). С каким цветом (r2, y2, b2) нужно смешать первый цвет, чтобы получить третий цвет?
Первая строка входного файла содержит вещественные числа r1 y1 b1. Вторая строка содержит вещественные числа r3 y3 b3.
Хотя бы одно из чисел в каждой тройке равно 1.
Во входных данных не более 2-х знаков после запятой.
Требуется вывести в выходной файл вещественные числа r2 y2 b2 с точностью не менее 5 знаков после запятой.
Все числа должны быть в диапазоне от 0 до 1, и хотя бы одно из чисел должно быть равно 1.
0 ≤ r1, y1, b1, r3, y3, b3 ≤ 1
Гарантируется, что для заданных исходных данных задача имеет решение.
№ | Входной файл (input.txt ) |
Выходной файл (output.txt ) |
---|---|---|
1 |
|
|
2 |
|
|
3 |
|
|
Предположим, что r2 = 1. Тогда из соотношения r3 = (r1 + r2) / k найдём k = r1 + 1r3, и тогда найдём остальные числа тройки: r2 = 1, y2 = r1 + 1r3y3 − y1, b2 = r1 + 1r3b3 − b1.
Далее нужно проверить, что 0 ≤ y2, b2 ≤ 1. Если это не так, то положим y2 = 1 и повторим аналогичную процедуру. Если мы опять не получили решение, то положим b2 = 1.
Докажем единственность решения. Предположим, что, когда мы положили r2 = 1 и y2 = 1, в обоих случаях выполняется неравенство 0 ≤ r2, y2, b2 ≤ 1. Это означает, что r1 + 1r3y3 − y1 ≤ 1 и y1 + 1y3r3 − r1 ≤ 1. Отсюда (r1 + 1)y3 ≤ (y1 + 1)r3 и (y1 + 1)r3 ≤ (r1 + 1)y3, поэтому (r1 + 1)y3 = (y1 + 1)r3. Следовательно, в обоих случаях r2 = y2 = 1, поэтому оба случая тождественны.
Пример решения:
var c1, c2, c3: array[1..3] of extended; k: extended; i, j: integer; ok: boolean; begin assign(input, 'input.txt'); reset(input); assign(output, 'output.txt'); rewrite(output); ok := false; for i := 1 to 3 do read(c1[i]); for i := 1 to 3 do read(c3[i]); for i := 1 to 3 do begin if (c3[i] > 0) then begin c2[i] := 1; k := (c1[i] + 1)/c3[i]; ok := true; for j := 1 to 3 do begin if (j <> i) then begin c2[j] := k*c3[j] - c1[j]; if not ((c2[j] >= -1e-10) and (c2[j] <= 1+1e-10)) then ok := false; end; end; if ok then break; end; end; for i := 1 to 3 do write(c2[i]:0:5, ' '); close(input); close(output); end.