競プロ弱者の解答

競プロ弱者の成長記録

ABC151:水色競プロerのムーブ備忘録(ループは「ここからはじめましょう、一から……いいえ、ゼロから!」?)

ABC149でパフォ1800オーバーを叩き出し、一気にHighest更新!!

テンションMAXからのunratedでテンションminで年末を迎え、

私にとって今年初ratedの参加記録です。

〇コンテスト名:ABC148

〇配点          A:100 B:200 C:300 D:400 E:500 F:600

〇制限時間  100分

 配点も時間もいつも通りのABCです。

〇コンテスト開始時のsyunsukeのレート 1269

〇今回の方針 

 基本的に前から解く。

 ハマってしまったら、飛ばして次の問題に進むが、順位表を時々チェック。

 そして、解いた人が多い問題を解くいつも通りの基本戦略

 

コンテスト開始!

A:アルファベットのz以外の小文字が与えられるので、辞書順で次の文字を出力する。

 ライブラリを使いましょう。

 とは言っても、alpha=["a","b",・・"y","z"]を事前にメモ帳にでも作っておいて、問題文を読んだらコピペ。

 でもこれはとても重要。速さを競う中で、一からアルファベットを入力していたら結構ミスります。しかも気づきにくく、テストケースは通ってしまいやすいのでWAを食らいます。コンテスト開始前にライブラリのメモ帳は開いておきましょう。

 それさえ済めば後は簡単

 s=input()

 alpha=["a","b",・・"y","z"]

 for i in range(26):

  if alpha[i] == s:

   print(alpha[i+1])

一応テストケースを確認して、テストケースが通るのを確認できたので提出

 1:52 AC

B:N問あって、満点はK点で、平均M点以上にしたい。N-1問目までの点数はAiとして与えられる。

 このBいつもより難しくないですか?

 言い換えれば合計NxM点以上にしたい。N-1問目までの点数の合計をsumAとすれば

 NxM - sumAが

  ・Kより大きければ不可能なので‐1を出力

  ・0より小さければ0を出力

  ・0~Kの間ならNxM - sumAを出力

 

 N,K,M = map(int,input().split())

 A = list(map(int,input().split())

 sumA = sum(A)

 if N*M - sumA > K:

  print(-1)

 elif N*M -sumA < 0:

  print(0)

 else:

  print(N*M - sumA)

 

 6:26 AC なんで皆さんそんなに速いんですか?

C:ACするまでに出したWAの数を数えよ。ACできなければノーカウント。AC後のWAもノーカウント。同じ問題で複数回ACしても最初のACのみ有効。で良いのでしょうか。

 それにしても、先日のno sub撤退がtwitterを賑わしている中でこの問題ですか。

 no sub肯定派も否定派も、no subがどうこう考える時間があったら精進しましょう。

 それは置いといて、これはリストを2つ持つと良さそうですね。

 

 N,M = map(int,input().split())

 AC = [0] * (N+1)

 WA = [0] * (N+1)

 ここで、リストの長さをN+1にしています。問題数はN問なのですが、リストの最初は0番目なので、必要な長さより1つ多いリストを作成すれば、入力された値をそのままリストに入れられますね。

 例えば、N=3でリストの長さが3で、入力値が3だった場合、リストの3番目に入れようとしてもエラーになります。でもリストの長さを1つ長くしておけば大丈夫。

 あとは、ACが出たらACリストの該当する番号を1にする(1を足すではなくて、「1にする」です。もともと0だった場合も1だった場合も関係なく、「1にする」です)。

 WAが出たら、ACリストの該当番号が0ならWAのリストの該当箇所に1を足す。

 

 for i in range(M):

  p,s = input().split()

  if s == "AC":

   AC[int(p)] = 1

  else:

   if AC[int(P)] == 0:

    WA[int(P)] += 1

 ans=0

 for i in range(1,N+1):

  if AC[i] == 1:

   ans += WA[i]

 print(ans)

 入力値は何もしなければ(int型に変換しなければ)str型。1行の入力の中に、int型とstr型で受け取りたいものがある場合に良い方法はないですかね?上みたいにできないことはないですが、面倒です。

 13:48AC

D:最大20x20の迷路の最長距離を求めよ。

 えらく小さな入力ですね。どう見てもこれがヒント。

 マス目は最大で20x20=400しかない。ある点(出発点)からの距離は400手で探索可能。

 出発点も400通りしか選べない。

 400 x 400 = 16,000  よって全探索確定!

 そして、迷路みたいな問題では、端の処理が面倒なので

 L = []

 kabe=["#"] * (W+2)

 L.append(kabe)

 for i in range(H):

  S = ["#"] + list(input()) +["#"]

  L.append(S)

 L.append(kabe)

 として、上下左右の端を"#"で囲ってから、縦はrange(1,H+1) 横はrange(1,W+1)の範囲で探索すれば端の処理(リスト外)を気にせずに済みます。

 あとはコードに落とすだけ。

 ・・

 ・・

 バグが取れません。

 ・・

 何で?・・!!

 

 ループは

 「ここからはじめましょう、一から……いいえ、ゼロから!」

 いやいや、ゼロから始めたらリスト外の処理が面倒だから一からはじめられるようにしたんでしょう?それを忘れてバグらせて何やってんの?

 バグをとって

 27:47AC 情けないバグのせいで時間をロスりました。

E:これは難しい! よっしゃ!!

 一応Fも開きましょう

F:2次元で3分探索でもすれば良いのか? それとも3点に接する円を全探索?でもその場合、2点が直径になる場合はどうする?

 よくわかりません これも難しい! よっしゃ!!!

 

 なぜ難しくてよっしゃ!かというと、この時点で400番台。EもFも難しいので、あまり解かれないでしょう。ということは、悪くても600番台で終了!そしてレートアップ!!ごちそうさまでした!

 あとは、たっぷり残った時間でもしもEが解ければ、200番台も夢じゃない?

 

 開始50分後 あれ?何でみなさんEが解けてるの?大きなレートアップは期待できないかな?

 開始70分後 もしかしてE解かないとレートダウンありえる?

 開始90分後 ヤバイヤバイヤバイ

 終了

 

結局27:47 4完0ペナ

パフォ1240でレート-3で1266になりました。

いや、なんで1100人以上もこのEを解いてるの?

どんな精進をすればこの手の問題を解けるようになるんでしょう。