📝

AtCoder Beginner Contest 283 レポート

2022/12/25に公開

概要

ABCD4完でした.本当にしょうもない結果で書くことがないです.

ABC283

  • コンテスト名: ユニークビジョンプログラミングコンテスト2022 冬(AtCoder Beginner Contest 283)
  • 順位: 1850th / 8272
  • パフォーマンス: 1075
  • レーティング: 1268 → 1250 (-18)
  • コンテスト参加回数: 68

https://atcoder.jp/users/hannaheptapod/history/share/abc283

A - Power

A - 問題

A^Bを出力せよ.

A - 解法

特筆事項なし.

A - ACコード

def main():
    A, B = map(int, input().split())

    ans = pow(A, B)
    print(ans)


if __name__ == '__main__': main()

https://atcoder.jp/contests/abc283/submissions/37479756

B - First Query Problem

B - 問題

長さNの数列Aに対して,次の2種類のクエリQ個を処理せよ.

  • 1 k x: A_kxに更新する.
  • 2 k: A_kを出力する.

B - 解法

本当に特筆事項なし.

B - ACコード

def main():
    N = int(input())
    A = list(map(int, input().split()))
    Q = int(input())
    queries = [list(map(int, input().split())) for _ in range(Q)]

    for q in queries:
        if q[0] == 1: A[q[1]-1] = q[2]
        else: print(A[q[1]-1])


if __name__ == '__main__': main()

https://atcoder.jp/contests/abc283/submissions/37485766

C - Cash Register

C - 問題

00, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9を組み合わせて整数Sを作る時,その最少個数を求めよ.

C - 解法

本当に本当に特筆事項なし.
00を優先使用するところでちょっとしたミスをして1WA.

C - ACコード

def main():
    S = input()

    idx = 0
    ans = 0
    while idx < len(S):
        if idx + 1 < len(S) and S[idx:idx+2] == '00': idx += 2
        else: idx += 1

        ans += 1

    print(ans)


if __name__ == '__main__': main()

https://atcoder.jp/contests/abc283/submissions/37494914

D - Scope

D - 問題

英小文字,(, )からなる良い文字列Sについて,左から順に次の操作を完了されられるか判定せよ.

  • S_iが英小文字ならば,set.add(S_i)する.ただし,set内にS_iがすでに存在する場合は終了.
  • S_i(ならば何もしない.
  • S_i)ならば,良く対応する(との間にある全ての英小文字S_jについてset.remove(S_j)する.

D - 解法

英小文字の位置をdict()で管理し,すでにある英小文字が出てきたら終了.
(のインデックスと位置をlist()で管理しつつ,cnt = 0と初期化したカウンタについて,(が出てきたらcnt++する.
)が出てきたらcnt--し,cntが良く対応する(の位置となるのでdict()の要素を処理.
良く対応する(の判定について1WAした挙句嘘解法を通した.Unratedになって欲しかった……

D - ACコード(嘘解法)

def main():
    S = input()

    dic = {}
    arr_l, cnt_r = [], 0
    for i, si in enumerate(S):
        if si == '(': arr_l.append(i)
        elif si == ')':
            delete = set()
            for k, v in dic.items():
                if arr_l[cnt_r] < v: delete.add(k)  # 嘘解法,2WA目で焦っていたとはいえ意味がわからない……
            for k in delete: del dic[k]
            cnt_r += 1
        else:
            if si in dic:
                ans = 'No'
                break
            else: dic[si] = i
    else: ans = 'Yes'

    print(ans)


if __name__ == '__main__': main()

https://atcoder.jp/contests/abc283/submissions/37501238

D - ACコード(追試)

def main():
    S = input()

    dic = {}
    arr_l, cnt = [], 0
    for i, si in enumerate(S):
        if si == '(':
            cnt += 1
            arr_l.append(i)
        elif si == ')':
            cnt -= 1
            delete = set()
            for k, v in dic.items():
                if arr_l[cnt] < v: delete.add(k)
            for k in delete: del dic[k]
        else:
            if si in dic:
                ans = 'No'
                break
            else: dic[si] = i
    else: ans = 'Yes'

    print(ans)


if __name__ == '__main__': main()

https://atcoder.jp/contests/abc283/submissions/37530607

E - Don't Isolate Elements

解法は何ら複雑なこともないし,思いついていたにも関わらず80分かけてDPが実装できず.

感想

採点ミスでUnrated騒動となったり,D問題とE問題の難易度差が1300以上と大きかったり,クリスマスイブに酷い目に遭いました(自分が悪い).
E問題がシンプルに実装が重めなだけで青難易度だったのが印象的ですね.
春からエンジニアで働くのに,アルゴリズム力を鍛えるよりもよっぽど実装力が必要だと思います.鍛えていきたい……

Discussion