МОЙ ДЕНЬ Школа Юрия Окунева

То, что
делает успех неизбежным

Задачка о программисте в больнице: ответ

Автор:

Дата:

Рубрика:

Мой день

Школа Юрия Окунева
0 голосов

Приветствую, друзья!

А вот и ответ на задание о программисте в больнице.

Всё, что мы можем делать, — это переливать кружки поочерёдно из одной фляги в другой и следить за тем, как меняется концентрация. Взяли кружку воды, налили в спирт, получили чуть разбавленный спирт. Потом взяли кружку этого спирта, налили во флягу с водой, получили очень разбавленный спирт. Потом снова зачерпнули воду из первой — и так до тех пор, пока концентрация в одной из фляг не приблизится к ответу.

Теперь выясним, за какой флягой нам надо следить. Если мы даже могли бы перемешать обе фляги, то общая концентрация получилась бы 48%, а это больше, чем нужно. Значит, нам нужно повышать концентрацию спирта во второй фляге с водой и следить за её значением.

Наша задача — понять, как меняется концентрация спирта в каждой фляге после переливания, и научиться это использовать.Обозначим концентрацию спирта в первой фляге К1, а во второй — К2. Если первым движением мы переливаем спирт в воду, то концентрация спирта во второй фляге будет такая:

К2 = (К1 + 100 × К2) / 101

Здесь мы берём концентрацию литра из первой фляги, складываем со ста литрами концентрации из второй и делим на общее количество получившихся литров.

После обратного переливания из второй в первую концентрация спирта в первой фляге будет такая:

К1 = (К2 + 99 × К1) / 100

Это значит, что мы берём концентрацию литра из второй фляги, добавляем его к остальным 99 литрам в первой фляге и делим на общее количество литров.

Смотрите, на каждом следующем шаге переливания будут повторяться, поэтому мы можем сказать, что на каждом нечётном шаге (1,3,5…) мы будем менять концентрацию К2, потому что переливаем во вторую флягу. А на каждом чётном переливании будем менять концентрацию К1 в первой фляге.

Осталось найти номер переливания, на котором концентрация во второй фляге станет чуть больше или равна 40%. Для этого лучше всего подойдёт код и цикл while — он будет выполняться до тех пор, пока выполняется заданное условие. А наше условие будет таким: выполнять цикл до тех пор, пока не получится нужная концентрация К2.

Напишем код, который выведет нам номер переливания, после которого нужно будет остановиться:

<span class="token comment">// переменные для концентрации и счётчик переливаний</span>
<span class="token keyword">var</span> k1<span class="token punctuation">,</span> k2<span class="token punctuation">,</span> i<span class="token punctuation">;</span>
<span class="token comment">// задаём начальные концентрации</span>
k1 <span class="token operator">=</span> <span class="token number">0.96</span><span class="token punctuation">;</span>
k2 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token comment">// пока не было ни одного переливания</span>
i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token comment">// переливаем до тех пор, пока не получится нужная концентрация</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span>k2 <span class="token operator"><</span> <span class="token number">0.4</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token comment">// увеличиваем количество переливаний</span>
  i <span class="token operator">+</span><span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
  <span class="token comment">// если чётное — меняем концентрацию первой бочки</span>
  <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> k1 <span class="token operator">=</span> <span class="token punctuation">(</span>k2 <span class="token operator">+</span> <span class="token number">99</span> <span class="token operator">*</span> k1<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">100</span> <span class="token punctuation">}</span>
  <span class="token comment">// если нет — то второй</span>
  <span class="token keyword">else</span> <span class="token punctuation">{</span> k2 <span class="token operator">=</span> <span class="token punctuation">(</span>k1 <span class="token operator">+</span> <span class="token number">100</span> <span class="token operator">*</span> k2<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">101</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// выводим количество переливаний, когда цикл остановится</span>
console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
JavaScript
Когда запустим код, увидим, что нам нужно остановиться после 179-го переливания.

 

Оставить комментарий

  • ;-)
  • :|
  • :x
  • :twisted:
  • :smile:
  • :shock:
  • :sad:
  • :roll:
  • :razz:
  • :oops:
  • :o
  • :mrgreen:
  • :lol:
  • :idea:
  • :grin:
  • :evil:
  • :cry:
  • :cool:
  • :arrow:
  • :???:
  • :?:
  • :!: