A問題の傾向と対策

はじめに

先日、茶色diffの傾向と、緑になるための対策 - dokinの競技プログラミングという記事を投稿しました。
この記事では、茶色diffが解けるようになるためには何が必要かを考察しましたが、そもそも灰色diffが解けるようになる段階でどういう能力が必要かわかっていないと正確な議論ができないと思ったので、以降何回かに分けて灰色diffの考察していきたいと思います。
まずは、ABCのA問題について、分類・考察していきます。

A問題の分類

対象はABC126~ABC178(現在の6問形式で開催されるABC)、2019年12月以降のABC級コンテストです。問題の解き方のネタバレが載っているので、閲覧注意でお願いします。

整数型とif文

A - Iroha and Haiku (ABC Edition)
A - AtCoDeer and Paint Cans:場合分けによる数え上げ
A - ABC/ARC
A - One Card Poker:複雑な条件の判定
A - ι⊥l
A - Between Two Integers:論理演算子(&&)の利用
A - Rotation:複雑な条件の判定
A - ABD
A - Happy Birthday!:状態の考察、判定
A - Rated for Me:複数ケースの場合分け
A - 753:論理演算子(||)の利用
A - Christmas Eve Eve Eve:複数ケースの場合分け
A - Rounding
A - Round One:場合分け
A - AC or WA
A - Poor
A - Sheep and Wolves
A - Five Variables:操作のシミュレーション
A - Air Conditioner
A - Not
A - November 30

整数型の計算(加減乗、割る2)

A - Children and Candies (ABC Edit):等差数列の和
A - Tak and Hotels (ABC Edit):場合分け
A - Trapezoids:図形問題
A - Fighting over Candies:判定
A - Addition and Subtraction Easy:場合分け
A - Two Rectangles:図形問題、最大値の計算
A - Restricted:判定
A - RGB Cards:整数問題、判定
A - Expired?:3つ以上の判定
A - ringring:最小値の計算
A - K-City:マス目の問題
A - Meal Delivery:絶対値、最小値の計算
A - Sandglass2:場合分け
A - Bichrome Cells:マス目の問題
A - One out of Three:場合分け
A - Rating Goal
A - Parking:最小値の計算
A - Libra:3つ以上の判定
A - New Year
A - Two Coins:判定
A - Traveling Budget:最小値+和
A - Cats and Dogs:判定
A - Day of Takahashi:考察による場合分け
A - Colorful Transceivers:複雑な条件の判定
A - Add Sub Mul:最大値の計算
A - Multiple of 2 and N:整数問題(偶奇で場合分け)
A - Task Scheduling Problem:絶対値
A - Garden:図形問題
A - Train
A - Pair:整数問題(偶奇で場合分け)
A - ABC333:整数問題(偶数、奇数)
A - Maximize the Formula:最大値の計算
A - Programming Education:文字列も使用
A - Discount Fare
A - Right Triangle:図形問題
A - White Cells:マス目問題
A - Five Antennas:判定
A - Buttons:操作のシミュレーション、最大値の計算
A - Airplane:最小値の計算
A - T or T:最小値の計算
A - Dodecagon:図形問題
A - Transfer:場合分け、操作のシミュレーション
A - +-x:最大値の計算
A - Password:場合の数の数え上げ(積の法則)
A - Curtain:場合分け
A - 9x9
A - Circle:図形問題
A - Blackjack:判定
A - 500 Yen Coins:判定
A - Beginner
A - Multiplication 1
A - Calc
A - Don't be late:判定
A - box

整数型の計算(割り算,余りなども利用)

A - Restaurant
A - Remaining Time:あまり
A - Sharing Cookies:余り(倍数)に注目した判定
A - Round Up the Mean:切り上げ
A - Product:偶奇判定
A - Buying Sweets
A - Infinite Coins:余りに注目した判定
A - Grouping 2
A - AtCoder Crackers:余りに注目した場合分け
A - B +/- A:整数問題
A - Favorite Sound:場合分け
A - Biscuit Generator
A - Ferris Wheel
A - Apple Pie:操作のシミュレーション
A - Harmony:場合分け
A - Serval vs Monster:切り上げ
A - Duplex Printing:切り上げ
A - The Number of Even Pairs:N個から2個を選ぶ
A - We Love Golf
A - ∴ (Therefore):10で割ったあまり
A - Takoyaki:切り上げ
A - Payment:切り上げ
A - Kyu in AtCoder:if文を用いても解ける
A - Number of Multiples:数え上げ

小数型の計算

A - Entrance Examination:整数同士の割り算
A - Odds of Oddness:確率
A - Circle Pond:図形問題

文字列型

A - AtCoder *** Contest
A - Haiku:文字列の置き換え
A - Three-letter acronym:文字コード
A - Shiritori:文字列の性質の判定
A - ABCxxx
A - Palindromic Number:整数を文字列として受け取るテクニック。整数でも解ける。
A - September 9:整数を文字列として受け取るテクニック。整数でも解ける。
A - Good Integer:整数を文字列として受け取るテクニック
A - Placing Marbles:数え上げ
A - Already 2018:文字列の書き換え
A - Diagonal String
A - abc of ABC:文字列の性質の判定
A - Something on It:前から順に処理
A - Eating Symbols Easy:操作のシミュレーション、前から順に処理
A - AtCoder Beginner Contest 999:整数を文字列をして読み込むテクニック
https://atcoder.jp/contests/abc119/tasks/abc119_a:文字列の性質の判定(場合分け)
A - Changing a Character:文字列の書き換え
A - Security:整数を文字列として読み込むテクニック
A - Fifty-Fifty:文字列の性質の判定
A - Red or Not
A - Tenki:数え上げ
A - Weather Prediction:場合分け
A - Can't Wait for Holiday:場合分け
A - Strings
A - Remaining Balls:操作のシミュレーション
A - Station and Bus:場合分け
A - Coffee:文字列の性質の判定
A - Lucky 7:整数を文字列として読み込むテクニック
A - A?C:場合分け
A - Registration:文字列の性質の判定
A - Rainy Season:場合分け
A - Plural Form
A - Keyboard:場合分け

その他

A - Grouping:配列
A - ABC Swap:操作のシミュレーション
A - Kth Term:配列

考察

C++Pythonでは大きく言語仕様がことなるので、勉強方法も当然変わってくると思います。
わたしはPythonをやったことがないので確かなことが言えませんが、向き不向きは人それぞれだと思います。
どちらかを勉強してみて、自分に合わないなーと感じればもう一方を勉強してみるとよいと思います(投げやり)。
もちろん、JavaやUnlambdaなど別の言語を用いるのもよいと思います。

A問題では、入力の個数が決まっており、for文配列などの複雑な処理を用いる必要がありません。(配列を使う問題もなくはないですが、例外です。)
そのため、

  • 基本テンプレート標準入出力
  • (int型、double型、char型、string型)の性質
  • 四則演算余り
  • if文

に関して基本的な扱いを理解していることが最も重要です。
C++で勉強する場合、AGP4bの一章を前から順番に解いていけば、必要な知識をほぼすべて補えます。

さらに、

  • 独特の問題形式に対する慣れ
  • バグが出たときに、どこが間違えているかを見つけ修正する能力
  • どうやって実装するか忘れたときに、インターネットの海から正しい情報を調べる能力

も訓練で鍛える必要があります。

同じA問題でも、難易度や出題形式にバリエーションがあります。
問題文に書かれている通りに素直に実装すればよい問題は簡単です。しかし、
シミュレーションが必要な問題場合分けが必要な問題などは、頭を使って考える必要があります。
また、文字コード整数を文字列として受け取るテクニックなど、コードを書く上で覚えておいた方がよい小技もいくつかあります。

レッドコーダーへの道も一歩から、焦らず一問ずつ解いていきましょう。