def input_n
  gets.to_i               # 単一整数
end

def input_s
  gets.chomp              # 文字列。chompを付けないと改行文字がついてくる
end

def input_a
  gets.split.map(&:to_i)  # スペースで区切られた複数の整数
end

def input_o(num)
  num.times.map { gets.to_i }  # 縦に並んだ複数の整数。たまにある
end

def output_f(num)
  puts sprintf("%.12f", num)
end


n = input_n

# スタート地点(1, 1)から(i, j)に到達するまでの移動回数はx座標について考えたとき、i - 1でありy座標について考えたとき、j - 1なので合わせてi + j - 2となる。よって、移動回数 i + j - 2 が最小になるように考える。
# 到達したいマスの値Nはi*jで記されているが、N <= 10 ** 12 なのでそのまま全探索するのは無理
# 一般に、N = i * j であるとき、 i <= N ** 0.5 かつ j <= N ** 0.5 であるため、探索範囲は N ** 0.5 までで良い
ans = n + 1 - 2 # (i, j) = (1, N)
max = (n ** 0.5).to_i + 1
(1..max).each do |i|
  if n % i == 0
    ans = [ans, i + (n / i) - 2].min # 「i * j = N」 より、 「j = N / i」
  end
end
puts ans