結果
| 問題 |
No.968 引き算をして門松列(その3)
|
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2024-08-14 20:40:54 |
| 言語 | Elixir (1.18.1) |
| 結果 |
AC
|
| 実行時間 | 1,383 ms / 2,000 ms |
| コード長 | 1,710 bytes |
| コンパイル時間 | 1,768 ms |
| コンパイル使用メモリ | 62,340 KB |
| 実行使用メモリ | 57,936 KB |
| 最終ジャッジ日時 | 2024-08-14 20:41:08 |
| 合計ジャッジ時間 | 13,859 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 10 |
ソースコード
defmodule Main do
def input, do: IO.read(:line) |> String.trim
def ii, do: input() |> String.to_integer
def li, do: input() |> String.split |> Enum.map(&String.to_integer/1)
def yn(b), do: IO.puts(if b, do: "Yes", else: "No")
@inf 10 ** 18
def main do
t = ii()
for _ <- 1..t do
[a, b, c, x, y, z] = li()
case kadomatu(a, b, c) do
[] -> -1
res ->
res
|> Enum.map(fn {a1, b1, c1} -> cost(a, b, c, a1, b1, c1, x, y, z) end)
|> Enum.min
end
|> then(fn x -> if x >= @inf, do: -1, else: x end)
end
|> Enum.join("\n")
|> IO.puts
end
# {a, b, c} -> {a1, b1, c1} にするコスト
# a <= a1, b <= b1, c <= c1
def cost(a, b, c, a1, b1, c1, x, y, z) do
co_a = (a1 - a) * y
co_b = (b1 - b) * z
co_c = (c1 - c) * x
da = (b1 - b) + (c1 - c)
db = (a1 - a) + (c1 - c)
dc = (a1 - a) + (b1 - b)
cond do
is_kadomatu(a - da, b - db, c - dc) ->
co_a + co_b + co_c
true ->
@inf
end
end
def kadomatu(a, b, c) do
for {a, b, c} <- [{b, a, c}, {b, c, a}, {a, c, b}, {c, a, b}] do
f(a, b, c)
end
|> List.flatten
|> Enum.uniq
|> Enum.filter(fn {x, y, z} -> x >= a and y >= b and z >= c end)
end
# a < b < c となるように b, c に加算
def f(a, b, c) do
cond do
a >= b -> f(a, a+1, c)
b >= c -> f(a, b, b+1)
true ->
[{a, c, b}, {b, c, a}, {b, a, c}, {c, a, b}]
end
end
def is_kadomatu(a, b, c) do
cond do
a <= 0 or b <= 0 or c <= 0 -> false
a == b or b == c or c == a -> false
true ->
[_, x, _] = Enum.sort([a, b, c])
b != x
end
end
end
norioc