"AtCoder Beginner Contest 121" で3完(だったはず)でした

また日曜だろうと思い込んでいたABCが土曜だったので用事で参加できず。早く茶色なりたいのに...。
先ほどやってみたら3完とTLEでした。

atcoder.jp


初見の感想は
A:優しいヒント
B:機械学習かな???
C:安い順に並べ替えてひたすら買っていけばいい...よな...?
D:書けるけどTLEになりそう(案の定めちゃくちゃなった)
という感じでしたね。この初見の感想コーナー何なんだろうって思いながら続けています。

A - White Cells

「元の行列から黒く塗る行と列の数だけちっちゃくなってる長方形の面積」ですね。

H, W = map(int, input().split())
h, w = map(int, input().split())

print((H-h)*(W-w))

いつでも入力の受け取り方こうしてるけど、いくつかを使い分けたりするのかな...と疑問に思うこの頃。

B - Can you solve this?

機械学習の分類みたいですね。

  • A、Bの各値はリストにする
  • zip関数でA、Bそれぞれ前から要素を一つずつ取り出してかけたものの総和を求める
  • 最後にCも足して>0だったらカウント+1
  • 上記操作を各Aのまとまりに対して合計N回調べる

という平凡な手順です。

n, m, c = map(int, input().split())
b = input().split()
cnt = 0

for i in range(n):
  a = input().split()
  sum = 0
  for ai, bi in zip(a, b):
    sum += int(ai)*int(bi)
  if sum + c > 0:
    cnt += 1

print(cnt)

操作内容的にNumpyかな?とも思いましたが、AtCoder内で普通に使えるかよく知らなかったので愚直に実装しました。

C - Energy Drink Collector

辞書?と一瞬思いましたが要素の順序という概念が無いの絶対困ると思って二重リストにしました。
二重リストをsorted関数に入れると、引数なしでは中の各リストたちの最初の要素[0]を見てソートされるみたいです。
まだまだ素人ですが、なんとなく出来そうって期待することだいたい出来るのでPythonはすごい。プログラミング言語作る人ってすごい。

ただitemgetter()というoperatorモジュール内の関数の方が速く、公式ドキュメントでも推奨されているようですね。
こういうものの存在すら知らないのマジでダメなので、これからもPython使っていく気持ちがあるからには一度公式ドキュメントをさらっとでも通読しないといけない...。

こちらの記事を参考にさせていただきました。

sota1235.com

  • 値段が安い順に並び替え、M本手に入れるまでひたすら買っていく
  • 「条件を満たせばそれで終わりにしたい」という時、関数定義でreturnに導けば楽に書けると知ったので使ってみた
n, m = map(int, input().split())
shops = sorted([list(map(int, input().split())) for i in range(n)])

def main():
  cost = 0
  got = 0
  for shop in shops:
    if got + shop[1] <= m:
      got += shop[1]
      cost += shop[0] * shop[1]
    else:
      cost += (m - got) * shop[0]
      return cost
  return cost
  
print(main())

D - XOR World

扱う数値の幅がでけぇ~と不安になりました。案の定、調べながら実装はできましたが山盛りのTLEを返していただきました(23ケース中17)。せめてどっちか進数のまま一旦最後まで計算する仕様にしないといけませんね。

a, b = map(int, input().split())
xor = 0

for num in range(a, b+1):
  xor = int(bin(xor ^ num)[2:], 2)
  
print(xor)

二進数と十進数の行き来ってデフォルトでいろいろやり方あるんですね。こちらの記事を参考にさせていただきました。



note.nkmk.me


qiita.com


解説pdf https://img.atcoder.jp/abc121/editorial.pdf を読んで「ほぇ~」って言ってました。
本番に参加できていたら手元でガリガリやることで気付けたかもしれませんが、ここまでシンプルな考えに落とせる自信はあまり無いです。


少し慣れてきたので蟻本や熱心な方の記事orコードを勉強して活かすこともしなければ...。