# AtCoder Beginner Contest 175

URL: https://atcoder.jp/contests/abc175 (opens new window)

# A

パターン数が少ないのでfor文で回すよりはif文で分岐した方が(書くのが)速そう

s = gets.chomp

if s == "RRR"
  puts 3
elsif s == "SSS"
  puts 0
elsif ["SRR", "RRS"].include?(s)
  puts 2
else
  puts 1
end

# B

n = gets.chomp.to_i
l_arr = gets.chomp.split(" ").map(&:to_i)

count = 0
(0..n-3).each do |i|
  (i+1..n-2).each do |j|
    (j+1..n-1).each do |k|
      l1 = l_arr[i]
      l2 = l_arr[j]
      l3 = l_arr[k]
      count += 1 if l1 != l2 && l2 != l3 && l3 != l1 && l1 < l2 + l3 && l2 < l3 + l1 && l3 < l1 + l2
    end
  end
end

puts count

# C

x,k,d = gets.chomp.split(" ").map(&:to_i)

# 正で統一
x = x.abs

num = [x / d, k].min
# まだxは正
x -= d * num
k -= num

# 原点をまたぐ操作を繰り返す
if k % 2 == 0
  # 往復
  puts x
else
  # 往復の往
  puts (x - d).abs
end

# D

require "set"
n,k = gets.chomp.split(" ").map(&:to_i)
p_arr = gets.chomp.split(" ").map(&:to_i)
c_arr = gets.chomp.split(" ").map(&:to_i)

# 添字調整
p_arr.unshift(0)
c_arr.unshift(0)

cycle_arr = []

set = Set.new
# 閉路がいくつかあるのでそれを求める
(1..n).each do |i|
  start_index = i
  # 重複してたどるのを避ける
  next if set.include?(start_index)
  index = start_index
  in_cycle_arr = []
  sum = 0
  while true do
    # 問題文では移動先のスコアを計上するとあるが, 対象のグラフは閉路なので移動元のスコアで計上しても大丈夫
    score = c_arr[index]
    in_cycle_arr << score
    sum += score
    # 通った印づけ
    set << index
    # 次のindex
    index = p_arr[index]
    # ループ判定
    break if index == start_index
  end
  cycle_arr << [in_cycle_arr, sum]
end

# 負の無限大(c_iの最小値で良い)
max = (10 ** 9) * (-1)

# 各閉路の各indexで試す
cycle_arr.each do |(cycle, sum)|
  cycle.each_with_index do |c, i|
    loop_num = 0
    t = cycle.length
    # sumが正ならなるべく繰り返した方がお得, 負なら繰り返さないほうがお得(0はどっちでもOK)
    if sum > 0
      # 最後の余りの部分だけ試したい
      loop_num = k / cycle.length
      t = k % cycle.length 
      # 余りは0にしないように
      if t == 0
        loop_num -= 1
        t += cycle.length
      end
    end
    in_sum = sum * loop_num
    t.times do |j|
      in_sum += cycle[(i + j) % cycle.length]
      max = in_sum if in_sum > max
    end
  end
end

puts max
Last Updated: 2020/08/18 23:38