ABC196 - C - Doubled

March 26, 2021

問題へのリンク

C - Doubled

雑感

コンテスト中に提出したものはNの桁数が1のときを考慮しておらずREを連発してしまい、焦ってかなり汚い。 制約が N<1016N < 10^{16} であり全探索をするとTLEになるので以下の考え方で書いた。

  • Nの桁数が奇数の場合は 10桁数110^{桁数} - 1 の形に修正する
  • 条件を満たす整数は xxxxyyyyxxxxyyyy という形になるため、前半の数が答えないし答え - 1になるのではないかと考え、NをStringにして前半と後半を分割する
  • Nの桁数が1桁の場合の答えは 00
  • 前半より後半の整数が大きい場合、答えは 前半の整数前半の整数 と一致する
    (例:120150)
  • 後半より前半の整数が大きい場合、答えは 前半の整数1前半の整数 - 1 と一致する
    (例:150120)

解説を見るともっと良い書き方がありそうなので後ほど更新する。

回答

  • コンテスト中に提出したもの
main.rb
n = gets.to_i
length = n.to_s.length

unless length == 1
  n = ('9' * (length - 1)).to_i if length.odd?
  split = n.to_s.scan(/.{1,#{length / 2}}/)
end

if length == 1
  puts 0
elsif split[0].to_i <= split[1].to_i
  puts split[0].to_i
else
  puts split[0].to_i - 1
end
  • 後から書き直したもの
main.rb
# TODO

公式解説

C - Doubled 解説


Profile picture

Written by capytan ギタリスト / プログラマー
Twitter: @capytan_el34