LoginSignup
3
4

More than 1 year has passed since last update.

競技プログラミングAtCoder ABCのB問題の難度と感想です。

Last updated at Posted at 2019-07-20

追記

139 250 b==1のときだけ0。あとはソケット口-1を足していく。 b==1の場合とその他を切り分けないと工夫が必要になる。
138 150 doubleで計算していくだけ。
150 k^2=Yijを満たす整数kが存在するかどうかを調べる。
137 100 簡単 座標Xから±Kの範囲を求めるだけ。for文の条件部分に書く。
136 100 簡単 文字列に変換して長さを求める。 他には桁数を算出するテクニックを使う。
135 100 簡単 ソート前とソート後を比較して、違いが2箇所以下かを調べる。 または for文で1からnまでとの違いが2箇所以下かを調べる。
134 100 簡単 監視範囲はdの2倍+1とわかる。(自分自身とその前後だから) その後端数は切り上げるために実数にして計算してから切り上げると答えが出る。
133 [B. Good Distance] (https://atcoder.jp/contests/abc133/tasks/abc133_b) 150 問題文のとおりに、各座標の差を求めてその2乗の合計の√を求めて、 整数であるかどうかを調べる。

ABCのB問題に関して。

A問題と比べてかなり解けなかった問題が増えました、過去問を知っていればすぐ解けるというような問題は少なかったと思います。
ループ、if,max,min,findなど基礎的な関数を知っていれば9割方解けます。
何問かは数学的素養が必要ですが知らなくても解けるような問題ばかりです、ダラダラと長く&読みにくくなってしまいますが。

コンテスト開催予定

AtCoder:競技プログラミングコンテストを開催する国内最大のサイト
https://atcoder.jp/

リポジトリ&成果

github
pg/ABC at master · masakinihirota/pg
https://github.com/masakinihirota/pg/tree/master/ABC

成果
AtCoder Problems
https://kenkoooo.com/atcoder/#/table/masakinihirota

AtCoder Problems
https://kenkoooo.com/atcoder/#/user/masakinihirota

※続き
ABCのA問題の過去問132問完走したので、難度とおすすめ度を紹介 - Qiita
https://qiita.com/masakinihirota/items/4989d0454700e1f6839f

難易度
200点以上 相応しい 手応えがある、難しい、調べたりソースを見た。
200点未満 解けた。
150点 時間をかけたが解けた。
100点 100点問題ぐらいの易しさ。
50点 簡単。

B問題リスト

B問題番号 B 難易度 Bの感想 参考URL
133 B. Good Distance
132 B. Ordinary Number 200 max() min() を使用して最小値と最大値を見て、条件を満たすものを見つける。 もしくは、sort()して元のとsort()した2番目と一致するかどうかをみる。 もしくは、すべての要素が一致するか見る
131 B. Bite Eating 250 ループを回すときに1ではなく0から回すとすると「L + i - 1」を「L + i 」で短くできる 全体の合計値がマイナスのときは最小値が食べてしまったりんごなので足す、 合計値がプラスのときは最小値が食べてしまったりんごなので引く。 https://qiita.com/masakinihirota/items/4371a4358a6621454204
130 B. Bounding 150 前のバウンド値を足していってカウントを+1していき、座標を超えたらループを終了する。
129 B. Balance 200 まず総和を求める、それからn番目までの合計と総和-n番目の合計を比較していき最小値を見つける。 もしくは、2重ループで、0からi番目とi+1からn番目の最小値と今まで見つけた最小値を比較して答えを出す。
128 B. Guidebook 250 make_pairを知っていると楽。 解説PDFのstring tmp=in;行 は不要
127 B. Algae 100 簡単
126 B. YYMM or MMYY 150 100で割ると左2桁 100の剰余は右2桁が手に入る。それを場合分けする。
125 B. Resale 100 簡単 v-cが0より大きいものだけ全部足せば最大値となる。
124 B. Great Ocean View 150 実際は、前の山より高い場合のみカウントすればいい。 以前より高い山が出現した場合はデータを更新する。
123 B. Five Dishes 200 配列の中からx%10=0以外の最小値を見つける。それ以外を切り上げて足していき、最後に最小値を足す。
122 B. ATCoder 150 ループで順に文字を見ていき、なかったらカウントをリセット、最大値を確保しておけばそれが答え。
121 B. Can you solve this? 150 愚直にソースコードに落とし込むだけ。
120 B. K-th Common Divisor 150 大きい順に見ていくのでマイナスのループを使ってk番目が答え。
119 B. Digital Gifts 150 入力処理時に数値処理をすると楽。 文字列は比較できる。
118 B. Foods Loved by Everyone 200 vectorを使う。 プログラムを書く時に引くという発想がなかなかできない、このプログラムでは入力時に得られた数値から-1を引いて配列に合わせている。
117 B. Polygon 150 入力処理時に、合計と最大値の処理も同時に行う。 あとは定理から判定を行うだけ。
116 B. Collatz Problem 250 初期値が与えられるので、その初期値を別に取り、チェック用の変数として活用する。 find関数(指定した値の場所を取り出す)を用いてチェック用の変数と新たに取得した値が違う場合にカウントしていた場所が答えとなる。
115 B. Christmas Eve Eve 100 ABC117Bと同じ。入力処理時に合計と最大値を取り出しておくと楽。
114 B. 754 200 連続して3文字なので1回のループで済む。 文字列のsize()-2までループを回して、 abs()で絶対値を計算して min()で最小値を見つける。
113 B. Palace 200 入力処理時に、温度の計算とAの値に近いかabs()で調べることと、その位置を記憶することを同時に行う。 プログラムは配列の添字に合わせているので、答えはansに+1としている。
112 B. Time Limit Exceeded 150 入力処理時に、t以下の場合の最小のコストをmin()を使って探す。 コスト最小値が答え、最小値がINFの場合は”TLE”
111 B. AtCoder Beginner Contest 111 100 ifかcaseで全パターン9種類書く、 もしくは、for文を111からstep+=111でループを回す。 ほかにも、ループを100~1000まで回して回して111の剰余が0の時が答え。
110 B. 1 Dimensional World's Tale 200 入力後、2つの配列をソートする。Xの最大値とYの最小値の間、 そしてYの値より小さいx[]の最大値、Xの値より大きいy[]の最小値の時が”No War”
109 B. Shiritori 200 単語と次の単語を用意する。この2つの単語の末尾と先頭を比較する
108 B. Ruined Square 250 図形問題 行列を知らないと解けない、自分は回転行列問題をすっぱり忘れてしまっているなので250点。 プログラム的には100点。回転行列を使わないのなら =>参考URLの図参照 https://jpliterature.hatenablog.com/entry/abc108-b-ruined-square_1
107 B. Grid Compression 250 行と列のboolを用意して 出力時にtrueのときのみ出力する。 「....」のみの行を消すのではなく、出力時のみ表示しない。(データはある)
106 B. 105 150 2重ループで%==0を調べていく、内側のループでカウントしていき8回カウントだった場合答えを+1していく。
105 B. Cakes and Donuts 100 簡単
104 B. AcCepted 200 条件を丁寧に抽出する 先頭がAで無い、大文字にするのが1番目の場合 末尾の一つ前が大文字の時 大文字にするのがC以外の場合 それぞれfalse。 すべての条件をきちんと設定出来るかどうかが鍵。
103 B. String Rotation 100 簡単 正規表現もしくはfindの使い方を知っていれば。 文字列1+文字列1とすることであとは正規表現をs2に使えば含むかどうか判断できる。 findを使う場合、見つからなかった場合は戻り値が-1 なので三項演算子は使えない。
102 B. Maximum Difference 50 簡単 nは100なので二重ループでも十分間に合う。
101 B. Digit Sums 100 簡単 文字列を数字に変換。
100 B. Ringo's Favorite Numbers 200 ひっかけ問題 一見計算だけすれば答えが出るように見えるが、n=100の時だけn=101にしないといけない。 n=100だとD+1回割れてしまう。
99 B. Stone Monument 100 簡単 塔の差から間隔を割り出し、総和を求めBを引く。
98 B. Cut and Count 250 右と左のX、Yを英小文字分用意する。 最初にX側に全てもカウント数を入力。 次に、X側は存在していたらマイナス、Y側は存在していたらプラスにして、そのループごとに最大値を求める。
97 B. Exponential 150 pow()は結果をfloatで取らないと丸められてしまった。 x=999の結果がintだと960 floatだと961。(myPC) atCoderの方では通ったけど・・・
96 B. Maximum Sum 100 最大値を求めてから3値の合計から最大値を引く、その後で最大値をk回2倍にする。
95 B. Bitter Alchemy 100 xからドーナツ最低数の合計値を引いて、お菓子の素の最小値で割る+最低数。 入力時に合計と最小値を求めておくと楽。
94 B. Toll Gates 150 配列の端をきちんと理解しているか問う問題。 aとは別にコスト表を作り、Xからそれぞれ端までの合計を計算する。
93 B. Small and Large Integers 150 aからbは確定、このループでaからk以内、bからk以内が条件である数字を出力。
92 B. Chocolate 200 合宿の期間から食べた間隔で割れば一人あたりの個数が出てくる。 もしくは、for文のstepをa[i]にする。
91 B. Two Colors Card Game 200 2重ループをつかう、内側はnとmの2つのループでチェックする。
90 B. Palindromic Numbers 150 桁数が5桁と決まっているのを利用する。 to_stringでa-b間の数字を文字列にして、 1番目と5番目、2番めと4番目が同じ数字なら回文数としてカウントをする。 他には、reverse()を使う。
89 B. Hina Arare 100 簡単 文字Yが含まれているかいないかで判断できる。 入力時にYをチェックすると楽。
88 B. Card Game for Two 100 簡単 sort()を使うだけ 第三引数にgreater()を入れると降順ソートになる。
87 B. Coins 150 簡単 3重ループをして 条件が揃った時答えを+1していく。 ほかにはa,bの2重ループを作り、残りのcはxからa,b分を引いた後0以上の時&%50が0の時&50<=cの時。
86 B. 1 21 100 簡単 文字列として取得、stoiで文字列を連結 sqrtで平方根をだし、+0.5すると端数が出れば切り上げになる。 あとは比較で結果が得られる。
85 B. Kagami Mochi 100 簡単 sort()を使う、その後 for文で隣同士を比較してより大きいかどうかを調べる。
84 B. Postal Code 100 簡単 -が1個存在しているか? それとも0個か2個以上かで判断する。 数字は長さを調べる必要もない。
83 B. Some Sums 200 テクニック ある数値を10の除数で1桁目の数字が取れる、次にその数字を1/10にすることでループにすることができる。 ソース参照
82 B. Two Anagrams 150 sは昇順ソート、tは降順ソートをして比較する。
81 B. Shift only 150 whileで割り切れなかったらflgをfalseにしてループを抜け出す。 あとはカウントするだけ。 または、入力時に2で割れる回数をチェックして最小値を保持しておく。
80 B. Harshad Number 100 簡単 各桁の総和のテクニック(ABC83B)を知っていれば簡単
79 B. Lucas Number 150 intではオーバーフロー 初項と第二項は入力しておく、あとはループで回す。
78 B. ISU 100 簡単 最初に左端を切り捨てる つまり x-zとしておくと、あとはそれからy+zで割ると答えが出る。
77 B. Around Square 100 簡単 sqrt()をint型で受け取り、2乗する。
76 B. Addition and Multiplication 200 基本を1としておき、基本に*2か+kかの小さい方を計算していくと答えが出る。
75 B. Minesweeper 300 難しい 面倒 #周りの8マスをどう調べるのか? 愚直に探す以外は、他人のソースを読むと調べる場所用の配列を独自に用意している。
74 B. Collecting Balls (Easy Version) 200 y軸は罠、問題は複雑に見せているだけで実は単純。 個別にxの距離と k-xの距離を計算して短い方をそれぞれ2倍して合計するだけ。x<kなのでabs()は使わない。
73 B. Theater 100 簡単 lとrの二点間の差を求めて合計していくだけ。
72 B. OddString 50 簡単 文字列の配列は0から始まるので、1文字づつ偶数の時に表示する。
71 B. Not Found 200 char a-zでループする countで文字を調べて0だった場合その文字を保存しておく、 その後sort()して先頭(辞書順で一番小さい文字)を表示する。
70 B. Two Switches 150 左側の最大値、右側の最小値を出しておき、その差を表示する、マイナスだった場合は0を表示する。
69 B. i18n 50 簡単 順番に表示していくだけ。
68 B. Break Number 200 割るではなく掛けるで考える。 1から2倍にしていきnを超える手前が答えとなる。
67 B. Snake Toy 100 簡単 ソートして後ろからk番目までを合計する。
66 B. ss 200 部分文字列の比較 for文で文字列の長さ/2-1から始めるのがポイント Substr(0, i) == substr(i, I) で比較する。iが4の場合 0123と4567になるのでiはかぶっているように見えてかぶっていない
65 B. Trained? 200 添字のi=1を探すのがポイント。 A[1]=? を探す
64 B. Traveling AtCoDeer Problem 50 sort()で末尾と先頭の差を表示する。 もしくはmax()とmin()を取り出してその差を表示する。
63 B. Varied 200 sort(),erase(),unique()を使う。この3つの関数で重複を削除できて、その差で判断する。
62 B. Picture Frame 100 n+2、m+2分だけ#を追加出力するだけ。
61 B. Counting Roads 200 都市の番号は添字であるとして、入力時に-1、そして都市用の配列の添字として使用して+1していく。
60 B. Choose Integers 250 整数問題 数学的素養が必要 aからa*bまでをbで割った余りにcが含まれているかどうかを調べる。 https://pyteyon.hatenablog.com/entry/2018/11/26/203000
59 B. Comparison 100 doubleを使う。 (ちなみにintは10桁、long longは18桁、doubleは308桁、long double は4932桁) 他には文字列として入力して比較するなど。
58 B. ∵∴∵ 150 一つのループ内で、2種類の添字をどう扱うか? 2種類の文字列の長さをどうさばくか?
57 B. Checkpoints 200 二重ループ内でマンハッタン距離の最小値とチェックポイントの添字を保存しておく。
56 B. NarrowRectanglesEasy 100 図を書いて3つのパターンに分けて考える。左と重なっている場合と右。
55 B. Training Camp 100 計算途中で余りを取る。 大きい数字のときは計算毎に余りを取るほうが無難です。 Const long long mod = 1e9+7 https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a
54 B. Template Matching 250 図形問題 チェック用の関数を作っておくと4重ループが2重ループになる。 4重ループはなれるまで何度も写経したほうがいい。
53 B. A to Z String 100 find(),rfind()で左右から探せる。 他にも、 find_first_of find_last_ofなど便利メソッドが使える
52 B. Increment Decrement 100 条件文でIの時とDの時に+にするか-にするか判断する。 max値は別にとっておく。
51 B. Sum of Three Integers 200 3重ループだとTLEとなる。 xとyが決まるとs=x+y+zのためzも自動的に決まる。これで二重ループ間に合うようになる。
50 B. Contest with Drinks Easy 150 入力時に合計をとっておくと楽。 pはtの添字なので-1にして配列の0-indexに合わせる。
49 B. たてなが / Thin 150 2重ループで高さの添字を半分、高さの回数を2倍。
48 B. Between a and b ... 200 数学的素養が必要 愚直に計算すると時間オーバー 解説PDFを読む。 基本的な考えがわからないときは参考URLを読む。 割り切れる個数はbをxで割ると出る。0-bまでの範囲と0-aまでの範囲の差が答えとなる、ただしa=0の場合は注意。 f(b)-f(a-1)で求まるがa=0の時f(-1)が呼ばれてしまう。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1160384666
47 B. すぬけ君の塗り絵 2 イージー / Snuke's Coloring 2 (ABC Edit) 200 範囲を切り捨てるのでそれ以下の場合はmax()、以上の場合はmin()で答えを保持しておく。 最後にマイナスの場合は0に置き換えて答えを出す。
46 B. AtCoDeerくんとボール色塗り / Painting Balls with AtCoDeer 200 数IAの集合と場合の数 表示にはcout << fixed << setprecision(0);を使う。 型はlong long 最初のボールは好きな色を選び、その後は残ったK-1色の中から自由に選ぶ事ができるので k*(k-1)^(n-1) https://pyteyon.hatenablog.com/entry/2019/01/04/222100
45 B. 3人でカードゲームイージー / Card Game for Three (ABC Edit) 200 文字列が長いと先頭を削除するとstringは前に一つづつずらす必要がある。O(n) Reverseしておくとpop_backで消せるので楽。O(1)
44 B. 美しい文字列 / Beautiful Strings 200 文字列の長さが奇数ならfalse count()で文字列を1文字づつ調べてすべて偶数ならtrue 途中で奇数を見つけたらfalse&break
43 B. バイナリハックイージー / Unhappy Hacking (ABC Edit) 150 Bを見つけたら空(empty())で無い場合は1文字消す操作をする、後は普通に表示する。
42 B. 文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition) 150 文字列単位でsort()操作をする。 vectorを使う。
41 B. 直方体 100 途中で何度割っても答えは同じなので掛け算ごとに 1e9 + 7で割り余りを出す。
40 B. □□□□□ 150 2重ループでnを超えない長方形の面積を出し 絶対値で差を出し余りを足した時の最小値を出す。 1重ループでも解ける。nと高さ決まれば自然と幅も決まる、その時余りを計算して最小値を求めればいい。
39 B. エージェント高橋君 50 簡単 sqrt()を2回 intでok。
38 B. ディスプレイ 50 簡単 それぞれの高さを比較。
37 B. 編集 150 入力データをO-indexに調整してからデータを上書きしていく。
36 B. 回転 200 数学的素養が必要 知らないと詰む問題
35 B. ドローン 300 解説PDF ‘?’をすべて調べる時間はない。 最小値と最大値のときだけを考えて計算する。
34 B. ペア 50 簡単 三項演算子
33 B. 町の合併 150 入力時に合計値と最大値を取得する。最大値を更新するごとに都市名を確保。
32 B. 高橋君とパスワード 150 setを使うことでinsert時に重複を削除できる。 部分文字列は固定長なのでsubstrで取得。
31 B. 運動管理 150 入力時に処理できる。 aを条件処理するだけ。
30 B. 時計盤 200 長針1時間に30度 1分で0.5度動く 短針 1分で6度動く 時計の針は12時間だが入力は24時間受け付けている。
29 B. カキ 100 入力時に処理をして、その時count()を使うと楽。 find()は見つからなかった時は-1を返す。
28 B. 文字数カウント 100 文字を添え字として使う Aは65 Fは70 もしくは、A~FまでをIF文に愚直に書く
27 B. 島と橋 200 平均を求めて 平均以外の値が入っていたらカウントを増やして隣の数値を増減させる。 最初にすべての島に平均に行き渡る方法を考えたが必要なかった。
26 B. N重丸 200 flgを使って偶数なら- 奇数なら+に分岐する。分岐した後はflgを反転させておく。 もしくは、降順ソートをして、その後でiで偶数か奇数を判断して足すか引くかを決める。
25 B. 双子とスイカ割り 150 入力時に値を下限値、上限値をチェックして変更しておく。 Eastだったら+それ以外だったら-にする。
24 B. 自動ドア 150 一つ前の入力をとっておき、その値が入力値aよりも大きい場合は差分を出して計算する。 その他の場合はtを足す。 もしくは、aiとai+1の差を取り小さい方を足していく。
23 B. 手芸王 200 文字列の足し算で前後に文字を足していく。 vectorで無いと通らない場合があった。
22 B. Bumble Bee 150 最短経路問題と聞いて身構えるが、この問題は単に重複している町があるかどうかを調べるだけの問題。 重複を許さないset型などを使って町の数と訪れた町の差を調べれば易しくなる。
21 B. 嘘つきの高橋くん 150 ABC022と似たような問題。setを使って重複を排除した後に総数を比較すると答えが出る。 連続して似たような問題が出るのは珍しい。
20 B. 足し算 50 入力は文字列として受け取る。 Stoi()は文字列を整数に変換する。
19 B. 高橋くんと文字列圧縮 200 意外に難しかった。 隣の文字と一致する場合は合計値+1、違う場合は文字を出力してカウントリセット。
18 B. 文字列の反転 150 3つに分けて真ん中をreverse()したあと文字列を足す。 もしくはreverse()でl-1からrまでの間を処理してn回ループする。
17 B. choku語 200 2文字の処理 文字列の長さが2以上でcとhが連続してある時、あとはokuがそれぞれある時。 または、正規表現を使う。
16 B. A±B Problem 100 素直に条件を書いていく。
15 B. 高橋くんの集計 100 入力中に合計と a=0のとき個数を引くを計算しておくと楽。
14 B. 価格の合計 150 2進数は%2で計算すると、余りが1の時と0の時の2種類となる。 ifで1の時だけ商品を合計する。 10進数のときのように%や/が使える。/=2とやると2進数の桁が一つずれる。
13 B. 錠 100 絶対値を取る。出した値と10から引いた値の最小値が答えとなる。
12 B. 入浴時間 100 printf("%02d") で2桁表示される。
11 B. 名前の確認 150 (char)toupper(s) (char)tolower(s) で文字変換ができる。
10 B. 花占い 100 6の周期で同一パターンとなる。両方もしくはどちらか片方が嫌いになっているパターンを潰していく。
9 B. 心配性な富豪、ファミリーレストランに行く。 150 重複排除できるsetを利用する。降順ソートして2番目を表示。
8 B. 投票 200 2重ループで重複する都市を探してカウントする。
7 B. 辞書式順序 50 簡単 結局はaであるかどうかを調べればいい。
6 B. トリボナッチ数列 150 固定の3番目まで設定しておき、後は3つづつ足していく。
5 B. おいしいたこ焼きの食べ方 50 簡単 入力時に処理する。 min()を使う。
4 B. 回転 200 180度はa[N – 1 – n][M – 1 – m] ABC36Bと似た問題。 または、1行を順に最下行&後ろから表示する。 数学的に解くには数学的素養が必要。
3 B. AtCoderトランプ 200 検索用文字列を作っておき、find()で一致するかどうか調べる。
2 B. 罠 50 簡単 母音のときはcontinueする。
1 B. 視程の通報 100 条件文を書くだけ。
3
4
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
3
4