LoginSignup
1
0

0.はじめに

 冠のないノーマル開催。
問題の難易度はいつもより高かったような気がします。
Dが何とかクリアできましたが、WA2回の為か順位は伸びず
レートも±0でした。

1.A - Zero Sum Game

 最初はだれがだれに勝ったとかシミュレーションしないといけないのか?と
思いましたが、A問題でそれはないなと思い返し解法にたどり着きました。
【考え方】
 ・全員の点数の合計は0になる。
 ・一人分の分からずそれ以外の人の点数はわかる
 ・与えられた点数の合計を0から引けば、答えとなる人の点数が分かる

 https://atcoder.jp/contests/abc349/submissions/52298533

2.B - Commencement

 なかなかややこしい問題。
問題の意図をつかむのが難しかったですが
プログラムを作る過程で意外と単純な問題なことが分かりました。

【考え方】
 ・文字列Sについて文字ごとの出現数を数え
  辞書Dにキー:文字、値:出現数をセット
 ・辞書Dの値を順に読み込み値毎の個数を数え
  辞書D2にキー:出現数、値:個数をセット
 ・辞書D2の値がすべて2であればYes、そうでなければNoを
  出力して終了

 https://atcoder.jp/contests/abc349/submissions/52305984

3.C - Airport Code

 一見、Bよりも簡単な問題。
といいつつ、記述ミスでWA1個を出してしまいました。
検索機能等を使えばもっと単純にできそうでしたが
まぁ素直に組んでみました。

【実装】
 1.フラグをC1~C3まで準備
 2.文字列Sはすべて大文字に変換しておく
 3.文字列Sを先頭から見ていく
  -1.C1~C3の値で以下の各処理
    -1.C1が0の時
     今見ているSの文字とTの1文字目を比較し同じなら
     C1に1をセット
    -2.C1が1でC2が0の時(1のelif)
    今見ているSの文字とTの2文字目を比較し同じなら
    C2に1をセット
    Tの3文字目がXなら合わせてC3に1をセット
   -3.C1が1でC2が1の時(1、2のelif)
    今見ているSの文字とTの3文字目を比較し同じなら
    C3に1をセット
  -2.C3が1の時Yesを出力して終了
 4.文字列Sのチェック後C3が1にならなければNoを出力して終了

 https://atcoder.jp/contests/abc349/submissions/52324162

4.D - Divide Interval

 初見ではあきらめて、後の問題を見に行きましたが
そっちも無理そうだったのであきらめて取り掛かりました。
のちに解説を見たところセグメント木を使うようなことが書いて
ありましたがそこまで複雑なことをしないで解けました。
(翌日には私の解法と似た感じ(で洗練された)のが追加されてました)

例題を見たりしていくうちに、考え方はわかったので
それに従って解いていきました。
【考え方】
 1.分割の左の数字が奇数なら、右の数字は次の数までしか分けられない
 2.偶数の場合、2でS回割り切れる場合割り切った後をjとすると
  分割は、i(0~S)とし、2のi乗×(2の(S-i)乗×j+1)のいずれかになる
 3.分割するときには、できるだけ大きい値で分割する考え方で
  問題ない
  4.分割の左の数字が0の場合は右の数字は2のN乗ならなんでもOK

【実装】
1.L,Rを入力
2.now:現在作成しようとしている数列の左側の数にLをセット
3.回答を格納するリストansを空で定義
4.nowが0の時
 -1.pに1をセット
-2.p*2がR以下の間、pに2をかけていく
-3.ansに(now,p)を追加
-4.nowにpをセット
5.nowがRとイコールになるまで以下を繰り返す
 -1.nowが奇数の時
 -1.ansに(now,now+1)を追加
 -2.nowに,now+1をセット
 -2.nowが偶数の時
 -1.ansに(now,now+1)を追加
 -2.ansに(now,now+1)を追加
 -3.s(nowを2で何回割れるか)に0をセット
 -4.j(now2でs回割った後の商)にnowをセット
 -5.flgに1をセット
 -6.flgが1の間以下の処理を繰り返す
-1.jを2で割った値をjにセット
-2.sに1加算
-3.jが2で割り切れないか、jが0の時、flgに0にする
 -7.iをsから0まで1ずつ減らして繰り返す
-1.2のi乗×j+1がR以下の時
-1.rnowに2のi乗×j+1をセットしてブレイク
-2.2のi乗×j+1がRより大きい時
-1.jに2を掛けてjにセット
 -8.ansに(now,rnow)を追加
 -9.nowにrnowをセット
6.len(ans)と中の値を出力して終了

 https://atcoder.jp/contests/abc349/submissions/52348766

以上

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0