AtCoder Beginner Contest 163 感想 &解説
AtCoder Beginner Contest 163が先ほど終了しました。
皆さん、お疲れ様でしたー。
コンテスト開始後問題を開こうとすると
"500 Internal Server Error" と出たと思います。
そうです。鯖落ちしていたのです。
ある方はこのような諸説をたてていたりします...
【もしかして】
— _ℝ ute_ (@rute_not_route) April 19, 2020
ジャッジサーバーに1万人が一斉に提出を行ったためにそこで"三つの密"の状態になり
サーバーがコロナウイルスに感染してunratedになった回
A問題ではIE(内部エラー)を初めて観測しました。
21:15:18には運営からunratedの通知が来ました。正直なところこれはもう仕方が無かったのかなと思います。
AtCoder社のサーバーってどのようになっているのかが気になります。
今回は、A問題・B問題・C問題を7分で通しました。(おそらく簡単だったかもしれません)
以降、解説と考察です。
A問題 A - Circle Pond
https://atcoder.jp/contests/abc163/tasks/abc163_a
半径がの円の周長はです。
Python3では、math.piを利用することで円周率を利用できるため
この値を出力できます。
https://atcoder.jp/contests/abc163/submissions/12080972
B問題 B - Homework
https://atcoder.jp/contests/abc163/tasks/abc163_b
ループを利用するとも考えたのですが、以下のような条件分岐によりで実行ができます
(1) もし sum(A) ≦ならば、-sum(A)を出力する
(2) そうでなければ、-1を出力する
https://atcoder.jp/contests/abc163/submissions/12082247
C問題 C - management
https://atcoder.jp/contests/abc163/tasks/abc163_c
この問題ですが、まず 0の要素が個あるリストを作成します。
次に、以下のようなループを回します。
リストの[A[i]-1]番目の要素を+1する
あとは、リストの各要素を出力すれば期待通りの出力を求めることが出来ます。
時間計算量はです。
https://atcoder.jp/contests/abc163/submissions/12095608
以降、unratedになってしまったので考察です。
D問題 D - Sum of Large Numbers
https://atcoder.jp/contests/abc163/tasks/abc163_d
の時、各に関して組み合わせの数は以下のようになります。
以降、といちいち書くのはややこしいのでをとします。
0,1,2,3の3通り
0 and 1 , 0 and 2, 0 and 3, 1 and 2, 1 and 3, 2 and 3
このうち、0 and 3と1 and 2が被っているので5通りになります。
0 and 1 and 2, 0 and 1 and 3, 0 and 2 and 3, 1 and 2 and 3の4通り
0 and 1 and 2 and 3 の1通り
同様に、の場合
= 5通り
= 7通り
= 7通り
= 5通り
= 1通り
となります。
ここで、気づくのは本来の通り数が6通り以上の時に通り数が少なくなっているということです。
これを実装すればよいのですが、Python3で実装しようとするとなぜかオーバーフローになってしまいました。別の解法があるかもしれないので、終了後に考えてみようと思います。(コメントなどで原因を教えていただけると助かります)
以上、AtCoder Beginner Contest 163 感想&解説 でした。
最後に「幻となった水パフォーマンス」の画像を掲載します。
(多分コンテスト終了後には茶色くらいに落ちていると思います)
ここで皆さんにお知らせがあります。
来週のyukicoderコンテストで、私が作問した問題が出題される予定です!(といっても、1問だけなのですが)
難易度は★1 ~ 1.5相当を予定しています。
コンテスト終了後、当ブログにて解説を公開する予定です。お楽しみに!
AtCoder Beginner Contest 162 (感想&反省)後日談
AtCoder Beginner Contest 162が先週日曜日の21:00-22:40に開催されました。
皆さん、お疲れ様でしたー。
結果から申し上げますと3完でした。(D以降が解ける気がしなくて萎えてましたorz)
パフォーマンス ・レーティング変化
コンテスト成績証
ユーザ名 | Rute |
---|---|
コンテスト名 | AtCoder Beginner Contest 162 |
順位 | 5450th / 10666 |
パフォーマンス | 614 |
レーティング | 440 → 459 (+19) |
というわけでほぼ中央値みたいな順位でしたね()
A問題
https://atcoder.jp/contests/abc162/tasks/abc162_a
様々な解法が考えられます。
を、文字列と考え、S[0],S[1],S[2]にが現れれば"Yes"と出力、そうでなければ"No"と出力しましょう。
コード: https://atcoder.jp/contests/abc162/submissions/11787793
B問題
https://atcoder.jp/contests/abc162/tasks/abc162_b
(1,N)の区間で変数iを用いて以下のループを回します:(ans = 0とします)
もしiが3または5で割り切れるなら ans には何も加算しない
そうでなければans にiを加算する。
これにより、時間計算量で処理が可能です。
コード: https://atcoder.jp/contests/abc162/submissions/11791945
C問題
https://atcoder.jp/contests/abc162/tasks/abc162_c
ん...全探索か これはであり、制約の範囲では最大でも
回だからPythonで間に合うな。
試しにコードテストに投げてみるか
コードテスト大混雑!!
コードテストしてから1分経過しても終わる見込みがない!!(
unratedを覚悟したが、「この現象により、コンテストがUnratedになることは、今のところありません。」ということからあることを思いつく。
コードテストが混雑してるならその時間利用して本気で全列挙してみるか。
ということで、やってみた!!
これでの制約上の全ての答えを出すことが出来ました。
あとはこのリストのK-1番目の要素を出力してしまいましょう!
計算量 驚愕の !! 解法です!(あまり類が無いと思います)
C問題、リストでO(1)で提出 ルンルン数みたいに制約が少なかったのでこの方法でも一応は解けます
— _ℝ ute_ (@rute_not_route) April 12, 2020
提出 #11822785 - AtCoder Beginner Contest 162 https://t.co/w7KBffTPI4#atcoder
ちなみに、後々調べてみると の解法では
Python3ではTLEになるものの、PyPy3ではACになることが判明。
あのときPython3で同様のコードを提出していたらペナルティを与えられたということです()
ちなみに、Python3とPyPyの違いについて、分かりやすくまとめてあると思ったページを以下に掲載しておきます。
https://qiita.com/OKCH3COOH/items/f0c5c4681bc30dddf7f4
D問題
スルー。
E問題
最初、おそらく計算量的に間に合わないことから、Double Factorialのように、何か計算をして出力をすることを思いつきました。
すると、以下のような数列が出来ました。(それぞれのN,Kに対してgcdを計算しました)
(Nを固定して、Kを変化させたときのgcdの総和の数列)
N = 2: 3,5,9,17,33,65 階差: 2+4+8+16+32
N = 3: 6,12,30,84,246,732 階差: 6+18+54+162+486
N = 4: 10,24,76,276,1060,4164 階差:14,52,200,784,3104
N = 2, N = 3のとき、階差が等比数列であると思ったのですが、N = 4の場合なぜか当てはまらず。
N = 5のときもあてはまらず。
結果、残り5分まで考えたものの、解の一般項が思いつかずここで撤退しました。
以上、ABC162の感想・反省などでした。
次回のABCではレーティング500・Highestを目指します!
あさかつ4/10 考察 by Rute
あさかつ4/10が終了しました。
皆さん、お疲れ様でした!今回は、AtCoder Problemsが落ちたりするなど、いろいろとトラブルがあり、制限時間が従来より15分短かったです。
私は3完で、茶difficultyまで解くことができました。(以降A~Cまでの考察です)
A問題
https://atcoder.jp/contests/abc139/tasks/abc139_b
この問題ですが、の場合、タップを接続しなくてよいのでを出力します。
それ以外()の場合、タップを接続する必要があります。
初期値 kuti = 1と定義し、それにを足していき、kuti ≧ B となった段階でのタップの個数を出力すればよいです。
コード
https://atcoder.jp/contests/abc139/submissions/11705848
B問題
https://atcoder.jp/contests/abc079/tasks/abc079_c
"+","-"を3つ入れる組み合わせは通りなので、それを全通り試せば良いです。
ただし、また答えが複数存在する場合はどれを出力してもよいものとします。
とあるので、複数行出力しないように実装しましょう。
コード:
https://atcoder.jp/contests/abc079/submissions/11706044
C問題
https://atcoder.jp/contests/abc079/submissions/11706044
締め切りが早い順にリストをソートする貪欲法で解くことが出来ます。
手順としては
1. 締め切りが早い順にリストをソートする
2. 以下のループをN回( i = 0 to N-1)行う
simekiri = ls[i][0] とし、now に ls[i][1]を加算する
now > simekiriの場合は締め切りに間に合わないので("No")を出力し、ループを終了
また、flagの値を+1する
3. flagの値が0ならば、締め切りに間に合わなかった仕事はないので("Yes")を出力
という手順です。
コード:
https://atcoder.jp/contests/abc131/submissions/11706199
以上、あさかつ4/10の考察でした。D以降は考えてみます
AtCoder Beginner Contest 161 感想&反省[For Beginners]
AtCoder Beginner Contest 161 が2020/04/04に行われました。みなさんお疲れ様でしたー。
今回はA,B,C問題を3完。Performanceも668と、茶色パフォーマンスでした。
解説
A問題
https://atcoder.jp/contests/abc161/tasks/abc161_a
いろいろな解法があります。
時間のかかる解法になりますが、3つの数字をリスト(配列)と捉え、問題文通りに実装すればよさそうです。
- A = list(map(int,input().split()))
- A[0],A[1] = A[1],A[0]
- A[0],A[2] = A[2],A[0]
- print(*A)
- #豆知識 (*リスト名)とすると、リストの
- 要素を全て出力することが出来ます
B問題
https://atcoder.jp/contests/abc161/tasks/abc161_b
問題文通り実装すればよさそうです。
- N,M = map(int,input().split())
- A = list(map(int,input().split()))
- B = sum(A)*(1/(4*M))
- ans = 0
- for i in range(N):
- if A[i]>=B:
- ans += 1
- if ans >= M:
- print("Yes")
- else:
- print("No")
C問題
https://atcoder.jp/contests/abc161/tasks/abc161_c
数学の問題です。始めに、
の3つのパターンでそれぞれどうするかを考えます。
1.の場合
をすると、絶対値はになり、その後はを繰り返すので
を出力しましょう。
2.の場合
例えば、の場合。となり、
の場合、となります。
つまり、がの最小値といえそうです。
ただし、これには例外があり、 の場合は、が最小値となります。
3.の場合
の場合
の場合
となります。つまり、がの最小値といえそうです。
ただし、場合によってはがの最小値となる場合があるので
を出力すればどちらのケースでも対応できます。
あとはこれを実装すればよいです。
- N,K = map(int,input().split())
- if N==K:
- print(0)
- elif N > K:
- if N%K == 0:
- print(0)
- else:
- print(min(N%K,K-(N%K)))
- elif N < K:
- if 2*N<K:
- print(N)
- else:
- print(abs(N-K))
D問題はどう見ても数学っぽいので飛ばしました。
E問題
https://atcoder.jp/contests/abc161/tasks/abc161_e
この問題、解けそうな感じがしたのでTryしてみました(解説ではありません)
まずは、テストケースを見てみます。
入力例 1 Copy
11 3 2 ooxxxoxxxoo ooxxxoxxxoo
出力例 1 Copy
6
高橋君は 日間のうち 日働こうとしています。ある日働いたらその後 日間は働きません。
働く日としてありえる組み合わせは「 日目」「 日目」「 日目」「 日目」の 通りです。
したがって、 日目に必ず働きます。
ここで考えたのは、"x"の数の累積和を利用して解くというものです。
(Sのi文字目をS[i]とします)
ooxxxoxxxoo という文字列があった時に、S[i]までの"x"の文字列の数をそれぞれ計算していきます。
すると、[0,0,1,2,3,3,4,5,6,6,6]という配列が完成しました。
働ける日の条件として
1日働いたら日は働かない
"x"の書いてある日付では働かない
という条件であるので
S[i]からS[i+C]番目の文字列で
・S[i] = "o"である
・S[i]からS[i+C]までの文字列に含まれる"o"の個数が1個以上ある
という条件に当てはまる日が働ける日の候補 ということで考えてみました。
それからいろいろと実装をしていきました。
すると、なんとサンプルケースに当てはまっていくではありませんか!
提出をしてみたのですがWA。理由が今でもよく分かっていませんorz
- N,K,C = map(int,input().split())
- S = input()
- L = [0]*(N)
- ans = 0
- P =
- for i in range(N):
- if S[i] == "x":
- ans += 1
- L[i] = ans
- for i in range(C):
- L.append(ans)
- Q =
- for i in range(N):
- flag = 0
- if S[i] == "o":
- #もし1日目で働ける場合
- if L[i+C]-L[i] <= C:
- #累積の休み日数がC以下
- P.append(i+1)
- else:
- if len(P) >= 1:
- s = P.copy()
- Q.append(s)
- P.clear()
- else:
- if len(P) >= 1:
- s = P.copy()
- Q.append(s)
- P.clear()
- Q.append(P)
- if len(Q) == K:
- for i in range(len(Q)):
- if len(Q[i]) == 1:
- print(*Q[i])
以上、A問題~C問題の解説と、E問題の考察でした。
今回を含め、以降の記事ではPython3で書いたコードをここにまとめることにします。
(Githubでも良かったのですがブログ上に貼り付ける方が便利なので)
ちなみに、今日21:00から行われる Judge System Update Test Contest 202004は、
unratedのコンテストです。(順位表から、4問なので おそらく旧ABC級?)
も し か す る と First Accepted (FA)を取れる機会にもなりそうなので、FA取りたい人は1番を目指して頑張って下さい!
(ペナルティはつきますがratedでは無いので関係ないと思います)
AtCoder Beginner Contest 160 感想&反省[for beginners]
ABC160が終了致しました。皆さんお疲れ様でした。
さて、感想を伝える前に、このブログを初めて閲覧される方もいるかと思いますので、ここで、このブログの説明を再度しておきます。(知っている方は飛ばして下さい)
【このブログについて】about this blog
このブログでは主に様々なプログラミングコンテストの問題の解説などを行います。ただ、実力があまり伴っていませんので、主に「灰色コーダー」・「茶色コーダー」向けの解説になることは承知下さい。
AtCoderの他、Codeforces,Yukicoderなどの解説を行っていきます。
So, this blog is commentary about Atcoder(ABC),Codeforces,Yukicoder and some of competition programming contests. My programming skill is not so well, so this commenary is for beginners(Main A,B problem)
A問題/A-Problem
解法
https://atcoder.jp/contests/abc160/tasks/abc160_a
この問題は単純で PythonならばS[2] = S[3]かつS[4] = S[5]を満たしているかを判定すれば良いです。
So, this problem is easy. You just have to judge second letter and third letter same , and forth letter and fifth letter same.
B問題/B-Problem
解法
https://atcoder.jp/contests/abc160/tasks/abc160_b
この問題ですが、まず円が用意されます。それに対して500を減算できる限界までから減算し続け、その回数幸福度のパラメータに1000を加算。
その後、5を減算できる限界までまたから減算し続け、その回数幸福度のパラメータに5を加算。
最後に、幸福度を出力すれば良いです。
This problem, you have integer that is money Takahashi'san have.
Please continue below:
If , substract by 500 and happiness parameter add 1000.
if , please continue below.
if ,substract by 5 and happiness parameter add 5.
if , please stop this roop.
Finally , happiness parameter is answer. so if you output this parameter, you get AC.
C問題/C-problem (解けませんでした / I didn't solve this problem.)
https://atcoder.jp/contests/abc160/tasks/abc160_c
この問題ですが、池の周りを回る巡回セールスマン問題と同値です。
This problem is equal to Traveling Salesman problem with around lake.
考察(個人的なもの、なにか抜け落ちていたらコメントをお願いします)
This is concideration , If this concideration is not perfect, please comment it.)
始めに私は昇順、降順の順番に考えました。
その後、入出力例2のような、池の周りを降順ではないような反時計回りの方法で回ることを考えました。(5→0→15)
この回答でsubmissionしましたが、テスト15までACして、後はWAでした。)
Firstly, I considered about ascending and descending order.
Second , I considered about input 2 case. ( 5 → 0→ 15) expected of descending order, and Counterclockwise.
I submit this answer, hoever I didn't get AC.
C問題が出来なかったのはとても悔しいので、解説を読むようにします。
I will try to read the explanation because I could not solve the C problem.
今回はA問題、B問題の2完でした。ちょっと不甲斐ないです。
I solved this contest's A problem and B problem.It was a disappointing result.
【ここからは日本語だけになります。/追記】
また、今回はちょっとレーティング制度に関してちょっと嫌な点がありましたのでこれは私の意見になりますが聞いて下さい。
今回、C問題は解けたとしても解けなかったとしても提出をするつもりはありませんでした。提出したところでパフォーマンスが数点しか上がらないので、メリットがないと考えました。
私が提出しようとして順位表を見たところ、600点の最低パフォーマンスが312, 300点の私のパフォーマンスが305だったので、提出する気になれなかったのです。
追記23:11) AC-predictorというツールを利用してパフォーマンスの値を見ました。通常では決して見ることはできません。通常でもパフォーマンスを見ることが出来るという誤解を与えた方には申し訳御座いません。
これにより、問題が解けたとしてもレーティングが上がらないので結局提出しませんでした(どっちみち解けはしないと分かっていましたが)
これは個人的な意見なのですが、初級者でレートだけを意識している方はこのような同じ気持ちになると思うんですよね。なので今回のコンテストによって競技プログラミングへの意欲が下がる方が多く出てこないでほしいと思っています。
皆さんはどのように思いますか?私の勝手な意見にはなりますが、コメントして頂けると幸いです。
追記23:08)この行為はスポーツマンシップに反するような行為であると自覚しております。今後はこのような行為をしないようにします。申し訳御座いませんでした。
以上、感想&反省でした。
Codeforces #629 (Div.3) 感想等
Codeforces #629 (Div.3)が昨日23:35から行われました。
当記事では、当該コンテストの問題についての解説を行います。
が、その前に
Codeforce重かったですよね....今回、20000人以上の参加になったみたいなので、ジャッジなども重くなったみたいです。(問題文が見れなくなることもありました)
A問題
個のテストケースが与えられて、それぞれに対して以下の問題を解きます:
2つの整数が与えられます。
をに任意回変更することが出来ます。(つまり、に何度も1を足すことが出来ます)
この時、をで割り切れるようにするには、を何回変更する必要があるか求めなさい。
制約:
解法
まず、がで割れるかどうかで条件分岐を行います。
(ここで、をで割ったあまりをとします。)
なら、何も操作する必要がありませんから、0を出力します。
なら、bに対して回の操作が必要ですから、
の値を出力します。
これでこの問題を解くことが出来ました。
B問題
個のテストケースが与えられて、それぞれに対して以下の問題を解きます:
2つの整数、が与えられます
文字が"a"で、それ以外の文字が"b"である文字列を考えます。このとき、
桁でこれを満たす文字列の内辞書順で番目の文字列を出力して下さい。
制約:
考察(Ruteは解けませんでした)
問題文を読むと、
"2桁が"b"で、残りの桁が"a"である文字列のうち番目の文字列を出力しなさい。"と言い換えることが出来ます。
ここで考えたのは、「異なる2つの2のべき乗で表される数字」というものです。
例えば、、、
のように、で表される数が数列になっています。
これを利用すれば、条件を満たす2進数を列挙することが可能になります。
追記13:45)例えば、のとき、数列の1項目であるを考える2進数としましょう。
の2進数表現は"11"なので、5桁にゼロ埋めし、その後に"1"の部分を"b","0"の部分を"a"としました。すると、"aaabb"が出力されます。
これを他のでも同様にすれば良いです。
ただ、一般項などが分からなかったために、作成したリストを提出しようとしましたが
65536文字以上のコードなので提出できません。
orz。まぁ対策はされていたということを初めて知ったので良い経験になりました。
A問題の1完です。koboshiさんの記事を読んでまた勉強したいと思います。
解説は以上です。コードなどの提示を求められましたら随時このブログに掲載します。
AtCoder Beginner Contest 159 感想と今後
今回思ったこと。灰色降格が見えてしまった....
というのも、A問題・B問題・C問題の正解者数が多すぎるので正直なところもう諦めていました。()
A問題
https://atcoder.jp/contests/abc159/tasks/abc159_a
数学っぽいけど 要するに 奇数の数の足し方の総和+偶数の足し方の総和 を求める問題ですね。これを出力すれば正解となります。
B問題
https://atcoder.jp/contests/abc159/tasks/abc159_b
スライスを利用すれば解くことが出来ます。
Pythonの場合、スライスはP[指定要素:指定要素+1]でその部分の文字列を取ることが出来ます。
今回は
とし、
S[0:K],S[L-1:N]が一致しているかいないかを判定すれば正解となります。
C問題
https://atcoder.jp/contests/abc159/tasks/abc159_c
愚直に考えるよりも、冷静に考えて3辺の長さがのとき最も体積が大きくなります。
よってを出力すれば正解となります。
D問題
https://atcoder.jp/contests/abc159/tasks/abc159_d
んー、よく分かりませんでした。
リストを再起コピー (b = A.copy())で各番目の要素のみを取り出したリストを作成するのは分かったのですが、おそらく全て実行してしまうととなるので撤退。
600点勢の中では早い方だとは思うんですけど、パフォーマンスはおそらく灰色間違いなしかと思います...Orz
今回の成長 → 時間はかかったがWAが1回もなかった!えらい!
【今後】
基本情報技術者試験が近いので、しばらくは競技プログラミングから離れるかもしれません(ただ、1日1問は解きます)
そこで様々な参考書を利用しようと思います
https://booth.pm/ja/items/1318168
https://booth.pm/ja/items/1573891
この2冊は「銀髪赤眼の後輩と学ぶ競技プログラミング」という本で、競技プログラミングに関することが書かれています。主に「銀髪赤眼の後輩と学ぶプログラミング2」を利用して勉強しようと思います(本書の内容については、ネタバレのためお伝えすることが出来ません、ご了承下さい)
②精進100問
E869120さん(競プロでかなり上位に位置されている方)が執筆した「 分野別 初中級者が解くべき過去問精選 100 問」というものがあります。
この問題を1日1問以上は解こうと思いますが、実践的な練習のため、ある程度の制限時間を設けようと思います。
300点問題相当 (100点を含む) = 15分以内
400点問題相当(100点等を含む) = 25分以内
それ以外 = 50分以内
これ以降は、解説を見る or ACしている方のコードを見て解説ACとしますが、なるべく解説ACとしたくはありません....
rng_59さんがパナソニックプログラミングコンテスト後に言っていたツイートを引用しますが、
コンテストに出たときとかに、各問題の早い人がどういう方針を取っているかを見る習慣をつけておくと楽な方針がすぐ出るようになっておすすめです
— rng_58 (@rng_58) 2020年3月14日
ということでした。ただ、早い人のコードが長い場合は分かりやすいコードを優先して読むようにします。
以上です。最後に
A問題祝正解者数8000人突破! またまた最高記録を更新したんじゃ無いでしょうか??