本番D解けませんでした。うーん… うまいこと組み合わせの計算が見つけられなかったのが良くなかったですね。(全部プラス、全部マイナスみたいなパターンだけ試して、ちげーってなって組み合わせに至らず、全探索に近いコードを書いてしまった人)
A問題
a, bが隣り合うのはaとbの差の絶対値が1以下のときしか無いので、そのとおりに計算する。
#!/usr/bin/env python # -*- coding: utf-8 -*- def solve(): a, b = map(int, input().split()) print("Yay!" if abs(a - b) <= 1 else ":(") if __name__=="__main__": solve()
B問題
基本的に (100のD乗)× N になるが、N=100の場合は割り切れてしまうため、101が100番目の数となるコーナーケースが存在する。
私は言語のコンパイルが苦手なので、こういう問題は不得意。
#!/usr/bin/env python # -*- coding: utf-8 -*- def solve(): a, b = map(int, input().split()) print(100 ** a * (b if b != 100 else 101)) if __name__=="__main__": solve()
C問題
本質的には各項について素因数として出現する2の総和を求める問題なので、ループでひたすら割って求めてあげるだけ。
個人的にはこの問題のほうがBより素直で簡単だった。。。300の中ではかなり優しそうな印象。
#!/usr/bin/env python # -*- coding: utf-8 -*- def solve(): n = int(input()) al = [int(i) for i in input().split()] ans = 0 for elem in al: while elem % 2 == 0: ans += 1 elem //= 2 print(ans) if __name__=="__main__": solve()
D問題
色々思い浮かべたけど、3パラメーターについて最小化、最大化するものの組み合わせを求めて合計値を出して、その中で一番大きいものが答えらしい。(若干、ほんまか?と思う節はある)本番はDPか?とか、枝刈りのなんか?みたいなことを考えていたけど、全然うまく頭の中で落とせず、しかも結局総当たりを書いてしまう・・・とかで全然だめでした。悲しいね。
なお、ちょっとコードで遊んでみたが、これくらいにしかならず、これ以上の改善は根本的な解決方針の改善が見込まれてそう。
p=input n,m=map(int,p().split()) l=[p().split()for _ in[0]*n] print(max([sum(sorted([sum([int(x[i])*[1,-1][k>>i&1]for i in range(3)])for x in l])[::-1][:m])for k in range(8)]))
最初の方に書いた、それなりにまともな解答もついでにリンクを貼る。
まとめ
400点問題は時間内にとききらないといけない実力でなければいけないという自覚はあるので、今回は失敗したな。。。。 という気持ちでした。ちょっと精進する時間がないのですが、コンテストに出ながら+1問復習で解くことを意識して頑張っていこうと思います。
もうちょっとレーティングは安定してあげたいね。400は普通に解けているので、できるはずなんだが。。。
余談
とりあえず記録が残っている限りではABC021に参加していたらしい。多分この頃は参加したての頃だ。
こう考えると僕も結構昔からやっているんだなあと思う。それほど力を入れてやっているわけではないが… とはいえ、早くなんとかして動くものを作らないといけないときに早く手を動かすことができるのは、競技プログラミングをしているからこそなのかもしれない。
レーティングは大きく上昇してはいないけど、プログラムの組み方、ロジックの簡略化等のセンスは磨かれたように感じている。目に見えるものばかりが成果とは言えないし、身に染みているものもたくさんあるので、これからものんびりと歩いていきたい。