LoginSignup
8
0

AtCoder Beginner Contest 332 B Glass and Mug を Elixir と C で解いてみた

Last updated at Posted at 2023-12-11

AtCoder Beginner Contest 332 B Glass and Mug を Elixir と C で解いてみたので,ご報告します.

アルゴリズムの解説

アルゴリズムはごく単純で,問題に書かれている通りに組んだだけです.

Cの場合にはループにしたのですが,1点,注意点があって,グラスとマグの更新の順番に気をつける必要があります.まずい更新の順序だと,正しい結果を得られなくなります.

Elixirの場合には,素直に再帰で解きました.Elixir向きの問題だと思います.

Cでの解答

#include <stdio.h>

int main()
{
  int k, g, m;
  int d1 = scanf("%d", &k);
  int d2 = scanf("%d", &g);
  int d3 = scanf("%d", &m);
  
  int p = 0, q = 0;
  for(int i = 0; i < k; i++) {
    if (p == g) {
      p = 0;
    } else if (q == 0) {
      q = m;
    } else if (g - p >= q) {
      p += q;
      q = 0;
    } else {
      q -= (g - p);
      p = g;
    }
  }
  printf("%d %d\n", p, q);
}

Elixirでの解答

defmodule Main do
  def main() do
    [k, g, m] =
      IO.read(:line)
      |> String.trim()
      |> String.split(" ")
      |> Enum.map(&String.to_integer/1)
    
    solve({k, g, m}, {0, 0})
    |> Enum.join(" ")
    |> IO.puts()
  end
  
  def solve({0, _, _}, {p, q}), do: [p, q]
  
  def solve({k, g, m}, {g, q}) do
    solve({k - 1, g, m}, {0, q})
  end
  
  def solve({k, g, m}, {p, 0}) do
    solve({k - 1, g, m}, {p, m})
  end
  
  def solve({k, g, m}, {p, q}) when g - p >= q do
    solve({k - 1, g, m}, {p + q, 0})
  end
  
  def solve({k, g, m}, {p, q}) do
    solve({k - 1, g, m}, {g, q - (g - p)})
  end
end    
8
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0