AtCoder ABC171 参加記

AtCoder ABC171 に参加したので参加記を書こうと思います。

所感

A - E までの 5 完でした。
解いた問題の中では C 問題が最難関で泣きそうでした。
あったまったのでとても嬉しいです。

f:id:granddaifuku:20200621225944p:plain

A - αlphabet

問題概要
  • 英大文字または小文字が 1 文字入力される
  • その文字が大文字か小文字かを答える
解説

a から z は順番に並んでいることを利用して、大文字か小文字か判定を行えば良いです。
提出したソースコード

B - Mix Juice

問題概要
  • N 種類の果物の値段が与えられる
  • その中から k 種類を選んだ時の最小コストを求める
解説

与えられた配列をソートして、小さい方から k 個の和をとります。
提出したソースコード

C - One Quadrillion and One Dalmatians /

問題概要
  • a, b, ... z, aa, ab, ..., zz, aaa, aab, ..., zzz, ... というようなルールのもとで N 番目を求める
解説

今回の A - E までで最難関でした。
名前の文字数が増える時の最初の番号を求めて、その番号との差異 (変数 diff に代入します) を求めます。
番号 N の文字数が上記の計算で一緒にわかるため、あらかじめその文字数分 a を答えの文字列に代入しておきます。
その後、diff を 26 で割った余りを取って、26 で割るを繰り返して文字列を置き換えていきます。
答えの文字列を反転して出力すれば終わりです。
26 進法変換ですね。
提出したソースコード

D - Replacing

問題概要
  • 長さ N の整数列が与えられる
  • Q 回、全ての B という値を C という値に置き換える
  • 各操作後の数列の和を求める
解説

あらかじめ与えられた数列の和を求めておき、map などで各数の個数を記録しておきます。
各クエリ毎に  B * (B の個数) を引き、 C * (B の個数)を足して答えを求めます。
B の個数を 0 にすることを忘れないようにしましょう。
提出したソースコード

E - Red Scarf

問題概要
  • 長さ N の整数列 A が与えられる
  • 別の長さ N の整数列 B があるが、値は不明である。
  • A の i 番目の整数は i 番目以外の整数列 B の xor を取ったもの
  • B の各要素を求める
解説 

与えられた数列の xor をあらかじめ求めておき、
各数に対して上記の数との xor を求めていけば良いです。
提出したソースコード