2022-01-01から1年間の記事一覧

(備忘録)問題解決のための「アルゴリズム数学」〜 13

問題 atcoder.jp 自分の回答 規則性があり、2のN乗の一の位は2→4→8→6と繰り返すのでNを4で割った余りが1、2、3、0の時、答えはそれぞれ2、4、8、6となります。 puts case gets.to_i % 4 when 1 2 when 2 4 when 3 8 else 6 end その他回答 配列使うパタ…

(備忘録)問題解決のための「アルゴリズム数学」〜 12

問題 atcoder.jp 自分の回答 規則性を考える問題なので実装はそこまで難しくないです。 (むしろその規則性を見つけ出すのが難しい) 下記の2つの条件を満たせばYesとなります。 条件1 |X| + |Y| <= N 条件2 X + Y の偶奇とNの偶奇が一致 これは書籍に記載が…

(備忘録)問題解決のための「アルゴリズム数学」〜 11

問題 atcoder.jp 回答 rubyに二分探索出来るメソッドが存在したので今回はそちらを使用しました。 Array#bsearch (Ruby 3.1 リファレンスマニュアル) N, X = gets.split.map(&:to_i) A = gets.split.map(&:to_i).sort result = A.bsearch{ |x| x >= X } puts…

(備忘録)問題解決のための「アルゴリズム数学」〜 10

問題 atcoder.jp 回答 これは比較的分かりやすかったですね N = gets.to_i A = gets.split.map(&:to_i) # i日目に勉強するdp1, i日目に勉強しないdp2の配列を用意する dp1 = Array.new(N+1, 0) dp2 = Array.new(N+1, 0) (0...N).each do |i| dp1[i+1] = dp2[…

(備忘録)問題解決のための「アルゴリズム数学」〜 9

問題 atcoder.jp 回答コード これも回答見ながらやりましたが、半分理解できた?くらいの感じですね # 動的計画法 部分和問題 # 配列初期化の為のメソッドを準備 def darray(n1,n2,ini=nil) Array.new(n1) { Array.new(n2) { ini } } end N, S = gets.split.…

(備忘録)問題解決のための「アルゴリズム数学」〜 8

問題 atcoder.jp 自分の回答 書籍に書いてある回答の手引き見て内容理解しててもいざ実装すると難しい。。。 これも他の方の回答見て参考にしています N,W = gets.split.map(&:to_i) # 入力を格納する配列 WN = Array.new N.times do WN << gets.split.map(&…

(備忘録)問題解決のための「アルゴリズム数学」〜 7

問題 atcoder.jp 自分の回答 書籍に手引きがあるからスムーズに答えられるけど、パッと問題だけ見たらまず分からないなこれ N = gets.to_i dp = Array.new(N) (0..N).each do |i| i <= 1 ? dp[i] = 1 : dp[i] = dp[i - 1] + dp[i - 2] end puts dp[N] その他…

(備忘録)問題解決のための「アルゴリズム数学」〜 6

問題 atcoder.jp 自分の回答 Rangeの(0...N)の部分を最初(0..N)としていたので最後のN部分(nil)が含まれていることが分からず沼りました。 また書籍見ながらなので回答の出し方はなんとなく分かるのですが、この辺りは今後自分で考えながら出せるように…

(備忘録)問題解決のための「アルゴリズム数学」〜 5

問題 atcoder.jp 自分の回答 これだと1つ1つのペアをeachするのでTLEになってしまいます。 gets cnt = 0 gets.split.map(&:to_i).combination(2).each do |i| if i.inject(:+) == 100000 cnt += 1 end end puts cnt 他の回答 gets # tally要素の数を数え上…

(備忘録)問題解決のための「アルゴリズム数学」〜 4

問題 atcoder.jp 自分の回答 injectめっちゃ使うようになった n, r = gets.split.map(&:to_i) puts n.downto((n-r)+1).inject(:*) / (1..r).inject(:*) その他の回答 combinationという便利メソッドがあるのか Array#combination (Ruby 3.1 リファレンスマニ…

(備忘録)問題解決のための「アルゴリズム数学」〜 3

問題 atcoder.jp 自分の回答 それぞれの色の枚数を数えて、それぞれの色を2枚選ぶ方法を算出して最後に合計を出力している (昨日学習したtallyが役に立つ) gets h = gets.split.map(&:to_i).tally arr = [] h.each do |k, v| arr << v * ( v - 1 ) / 2 if …

(備忘録)問題解決のための「アルゴリズム数学」〜 2

問題 atcoder.jp 自分の回答 各値段の数をcountし、最後に500円になるパターンを積の法則を利用して算出している。 countを4回やっている部分どうにかしたいけど思い付かなかった gets price = gets.split.map(&:to_i) a = price.count(100) b = price.count…

(備忘録)問題解決のための「アルゴリズム数学」〜

問題 atcoder.jp 自分の回答 inject便利 Enumerable#inject (Ruby 3.1 リファレンスマニュアル) puts (1..gets.to_i).inject(:*)

AtCoderをやって18

問題 atcoder.jp 自分の回答(不正解) これだと1回多くカウントされちゃいますね。 n, x = gets.split.map(&:to_i) a = gets.split.map(&:to_i) b = 0 cnt = 0 a.each do |i| if b <= x b += i cnt += 1 end end puts cnt 他の方回答 N,X = gets.chomp.spli…

AtCoderをやって17

問題 atcoder.jp 模範回答 累積和の問題だったのですが全く分からず、、、 色々なやり方があったのですが、これがとりあえずシンプルでわかりやすかった 累積和勉強します N = gets.chomp.to_i ws = gets.split(' ').map(&:to_i) answer = [] N.times do |i|…

AtCoderをやって16

問題 空港 A, B, C があり、それぞれの空港の間では、双方向に飛行機が運航しています。 空港 A, B 間の飛行時間は片道 P 時間、空港 B, C 間の飛行時間は片道 Q 時間、空港 C, A 間の飛行時間は片道 R 時間です。 いずれかの空港からスタートして他の空港に…

(備忘録)AtCoderをやって15(Guidebook)

問題 atcoder.jp 自分の回答(他の方の回答参照しつつ) まずsort_byの使い方で苦戦しました。さらに番号を要素にどう持たせて出力するかで悩みました。 空の配列を用意して、timesのブロックで渡した引数を配列に入れていけば良かったですね。 その後sort_by…

(備忘録)AtCoderをやって14

問題 atcoder.jp 他の回答 今回は問題の趣旨よく分からんかったので回答見ながら学習(とは言っても30パーセントくらいの理解) 累積和の理解が出来ず n,m = gets.split.map(&:to_i) x = 1 y = n m.times do l,r =gets.split.map(&:to_i) x = [x,l].max y …

(備忘録)AtCoderをやって13

問題1 A 歳の高橋君が観覧車に乗ろうとしています。 この観覧車は、13 歳以上が乗るには B 円 (B は偶数) かかりますが、6 歳以上 12 歳以下の人はその半額で乗ることができ、 さらに 5 歳以下の人は無料で乗ることができます。 高橋君が観覧車に乗るには何…

(備忘録)AtCoderをやって12(Dice and Coin)

問題 下記参照 atcoder.jp 自分の回答(不正解) N, K = gets.chomp.split.map(&:to_i) arr = [] i = N + 1 if N <= K # 分からなかった else (1..N).each do |n| if n == 1 probability = Rational(1, N) * Rational(1, 2)**(i) arr << probability else pr…

(備忘録)AtCoderをやって11

問題 A, B, C からなる長さ N の文字列 S と、1 以上 N 以下の整数 K が与えられます。 文字列 S の K 文字目を小文字に書き換え、新しくできた S を出力してください。 atcoder.jp 自分の回答 絶対にもっといい回答あると思ったけど思い付かなかった n, k =…

AtCoderをやって10

問題1 高橋君は胃が強いので、賞味期限を X 日まで過ぎた食品を食べてもお腹を壊しません。 賞味期限を X+1 日以上過ぎた食品を食べると、お腹を壊します。 また、賞味期限を過ぎずに食べると、おいしく感じます。そうでない場合、おいしく感じません。 高橋…

AtCoderをやって9 (Colorful Leaderboard)

問題 AtCoderでは、コンテストに参加すると「色」が付き、これはレートによって次のように変化します: レート 1-399:灰色 レート 400-799:茶色 レート 800-1199:緑色 レート 1200-1599:水色 レート 1600-1999:青色 レート 2000-2399:黄色 レート 2400…

(備忘録)AtCoderをやって8 (Candies)

問題 2×N のマス目があります。上から i 行目、左から j 列目 (1≤i≤2, 1≤j≤N) のマスをマス (i,j) と表すことにします。 あなたははじめ、左上のマス (1,1) にいます。 あなたは、右方向または下方向への移動を繰り返し、右下のマス (2,N) に移動しようとし…

(備忘録)AtCoderをやって7

問題1(A問題) 2018 年 1 月某日、高木さんは書類を書いています。書類には、その日の日付を yyyy/mm/dd という形式で書き込む欄があります。例えば、2018 年 1 月 23 日は 2018/01/23 となります。 書類を書き終えたあと、高木さんは日付欄の先頭に誤って…

(備忘録)AtCoderをやって6(Traveling)

問題 シカのAtCoDeerくんは二次元平面上で旅行をしようとしています。 AtCoDeerくんの旅行プランでは、時刻 0 に 点 (0,0) を出発し、 1 以上 N 以下の各 i に対し、時刻 t iに点 (x i、y i) を訪れる予定です。 AtCoDeerくんが時刻 t に 点 (x,y) にいる時…

(備忘録)AtCoderをやって 5 (白昼夢)

問題 英小文字からなる文字列 S が与えられます。 Tが空文字列である状態から始め、以下の操作を好きな回数繰り返すことで S=T とすることができるか判定してください。 T の末尾に dream dreamer erase eraser のいずれかを追加する。 制約 1≦∣S∣≦10 5 S は…

(備忘録)AtCoderをやって 5 (Otoshidama)

問題 日本でよく使われる紙幣は、10000 円札、5000 円札、1000 円札です。以下、「お札」とはこれらのみを指します。 青橋くんが言うには、彼が祖父から受け取ったお年玉袋にはお札が N 枚入っていて、合計で Y 円だったそうですが、嘘かもしれません。この…

(備忘録)AtCoderをやって 4

問題1 N 枚のカードがあります. i 枚目のカードには, a i という数が書かれています. Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります. 2 人が…

(備忘録)AtCorderをやって 3 (Some Sums)

問題 1 以上 N 以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を求めてください。 制約 1≤N≤10 4 1≤A≤B≤36 入力はすべて整数である 入力 N A B 自分の回答 各桁の和ってどうやって求めるんだろうと思ってたけど、digitsとsumを使え…