概要
Rubyの練習のために実装例を書いてみます
問題の解説を目的とした記事ではありません
A - Shout Everyday
- 問題: https://atcoder.jp/contests/abc367/tasks/abc367_a
- 提出: https://atcoder.jp/contests/abc367/submissions/56856137
時刻としてありうるのは高々24通りなので、起きている時間をすべて試して問題ないです
# 入力を受け取る
A, B, C = gets.split.map(&:to_i)
# 起きている時間についてループ
t = C
while t != B do
# 時刻Aで起きていたらYesを出力して終了
if t == A then
print "Yes"
exit
end
t = (t + 1) % 24
end
# Noを出力
print "No"
B - Cut .0
- 問題: https://atcoder.jp/contests/abc367/tasks/abc367_b
- 提出: https://atcoder.jp/contests/abc367/submissions/56856306
文字列として受け取り、最後の'0'を削除します
chopで末尾を削除した文字列を返してくれるみたいです
# 入力を受け取る (改行文字を削除しておく)
X = gets.chomp
ans = X
# 最後の文字が'0'である間、削除し続ける
while ans[-1] == '0' do
ans = ans.chop
end
# 小数点が残っている場合は削除する
if ans[-1] == '.' then
ans = ans.chop
end
# 答えを出力
print ans
C - Enumerate Sequences
- 問題: https://atcoder.jp/contests/abc367/tasks/abc367_c
- 提出: https://atcoder.jp/contests/abc367/submissions/56856540
forで降順ループが書けない(?)みたいなので、downtoというのを使うと良いっぽいです
# 入力を受け取る
N, K = gets.split.map(&:to_i)
*R = gets.split.map(&:to_i)
# 総和を保持しておく
s = N
# 整数列は最初すべて1としておく
p = Array::new(N, 1)
loop do
# 総和がKの倍数なら整数列を表示する
if s % K == 0 then
for n in p do
print n, " "
end
print "\n"
end
# 次の整数列を求める
(N-1).downto(0).each do |i|
if p[i] + 1 <= R[i] then
s += 1
p[i] += 1
break
else
s += 1 - p[i]
p[i] = 1
end
# 最後の整数列なので、終了
if i == 0 then
exit
end
end
end
D - Pedometer
- 問題: https://atcoder.jp/contests/abc367/tasks/abc367_d
- 提出: https://atcoder.jp/contests/abc367/submissions/56856770
1回目のforでは普通に、2回目のforでは差分を更新しながら足していきます
# 入力を受け取る
N, M = gets.split.map(&:to_i)
*A = gets.split.map(&:to_i)
# 答えを保持
ans = 0
# 累積和を保持
csum = Array::new(2 * N + 1, 0)
# cnt[i] = Mで割った余りがiである箇所はいくつあるか?
cnt = Array::new(M, 0)
for i in 0...N do
# 累積和を更新
csum[i + 1] = csum[i] + A[i]
# 現在の和をMで割った余りを保持
m = csum[i + 1] % M
# Mで割った余りが等しい箇所の個数を答えに加算
ans += cnt[m]
# 今の箇所の分を足す
cnt[m] += 1
end
for i in 0...N do
# 一周前の和をMで割った余りを保持
pm = csum[i + 1] % M
# 累積和を更新
csum[N + i + 1] = csum[N + i] + A[i]
# 現在の和をMで割った余りを保持
m = csum[N + i + 1] % M
# 一周前の分を減らす
cnt[pm] -= 1
# Mで割った余りが等しい箇所の個数を答えに加算
ans += cnt[m]
end
# 答えを出力
print ans