Easy_4
$⌊X×1.08⌋=N$ を満たす整数$X$を求める。$N$は1から50000での整数。
$O(1)$でもいけるが多少の紛れが生じる。
$N$から$X$を求めるより$X$から$N$を求める方が遥かに容易。
$N$が大きければ二分探索法の出番だが、今回の制約なら全探索で十分。
$X$を1から50000まで見ていって、解が見つかれが途中で終了する。
プログラムの終了 exit
Crystalにはreturn文があるが、メインプログラムには使えないとのこと。
exit(status)で終了できる。正常終了ならexit(0)。デフォルトでstatus = 0なのでexitでよい。1
eachは(a..b).each {|i| ... }で他言語のfor文のような事が出来るのだが、blockとかyieldとか調べていくと味わい深い2。実質的には1から50000までの数を順々に{}内に投げて、{}内ではxで受け取って処理している。
n = read_line().to_i
(1..50000).each { |x|
if x * 108 // 100 == n
puts x
exit
end
}
puts ":("
Easy_5
-
M個からなる数列のセット$\{\{A_{i1}, A_{i2}, …, A_{iM}\}, i=1...N\}$
-
数列$\{B_1, B_2, …, B_M\}$
-
定数$C$
が与えられる。
$A_{i1}B_1+A_{i2}B_2+…A_{iM}B_M+C>0$を満たすセットはいくつあるか。
n回ループ times
n.times do...endでn回ループが実現する。
n.times do |i|...endで何回目のループかを取得することも出来る。0-indexだが。
複数を組み合わせるzip
zipは2つ以上の配列(正確にはIteratorあるいはEnumerable)に使えるメソッド。
a.zip(b)とすると、aとbのそれぞれ先頭から一つずつ順にとってきてタプルの配列にする。
Iteratorの時はlazyに、Enumerableの時はeagerlyな挙動なのか。
a = 1..4; b = 2..5; c = 3..6
p! a.zip(b, c) # => [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}]
zipの括弧内の要素が余るのは問題ないが、足りないとエラーなる仕様。
a = 1..3; b = 2..5; c = 3..10
p! a.zip(b, c) # => [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}]
p! b.zip(a, c) # => Unhandled exception: Index out of bounds (IndexError)
タプルも波括弧{}
a.zip(b)は[{ai0, b0}, {ai1, b1},... , {aim, bm}]の形の配列を生成する。{x, y}はタプルと呼ばれる表現で、他言語では丸括弧()を用いるものも多いがCrystalでは波括弧{}を用いる。
{x, y}の形のタプルはクロージャ内では|x, y|という記法で受けることができる。
後置if
if cond do_somethingはdo_something if condと書くことができる。do_somethingが短ければ(文頭とifが一つの視界に入る程度なら)、分かりやすい。
AC例
n, m, c = read_line.split.map(&.to_i)
b = read_line.split.map(&.to_i)
ans = 0
n.times do
a = read_line.split.map(&.to_i)
ans += 1 if a.zip(b).map{|x, y| x*y}.sum + c > 0
end
puts ans