とりあえずランクBの問題はスラスラ解けるようになりたい。
随時追加方式
計算量考慮
- B - Sum of Three Integers
- C - Otoshidama
処理時間の計算を行なってからロジックを考える必要がある
アルゴリズム 全探索を行う際の時間計算量の求め方 - ' P '追記6/6
こういう三重ループを考えてしまう際で、和の値とそれぞれの個数の積をマッチさせるような問題では、
単純にif(x*i + y*j + z*k == total)
みたいな書き方をしよう。なぜか変な書き方してしまう。
10進数
B - Palindromic Numbers
10進数の和を求めるときの定数であるn % 10
を忘れないことと、例にはあえて載っていない回文数は12X21
というのもあるということを忘れてはダメB - Some Sums
10進数の和を求めるときの定数であるn % 10
を忘れていつも無理くりStringとかcharを使って回答してしまうけど、 その場合のcharのint変換でいつも迷うので、そこらへんは押さえておかないといけない
Java String型からInt型変換とか, vice versa (あとChar to Int/ int to char & char to String) - ' P '
文字列結合
- B - OddString
文字列の結合をloop内で行う場合にはStringBuilder
を使わないとメモリ制限が超過すると思っておいたほうがいい。
あと、charで実施する場合は基本中の基本だと思われるが、char型値の文字列結合もしっかりと押さえておかないと。
Java StringBuilder vs String Concatenate パフォーマンスの違い - ' P '
Java charの結合 - ' P '6/4 追記
charの結合で一旦提出してみたら、見事にMLEが。
String out += "" + s[i];
みたいにした。
やはり素直にStringBuilderを使うほうがよい。
Bucket Sort
- B - すぬけ君の塗り絵 2 イージー
問題固有のロジックを考える必要があるけれど、単純に行いたいことは何か?を考えると塗りつぶされていない部分の面積を求める = 面積を求めるための幅と長さを求めるになるはず。
それを行うためのロジックを考えるような問題だと思う。Bだから面積分の二重arrayを使って塗り潰されたされた部分を把握する、という方法でも全くよさそうだけど、コードがどうしても長くなると思われる。
ちなみに、縦*横がどちらもマイナスだとプラスになってしまうことは要注意。。
Algorithm Bucket Sort - ' P '
連想配列
- B - Two Colors Card Game
下記記事でドヤ顔して書いてましたけど、Set/HashSet
を用いたCollections.frequency()
は使えるようになっておきたいところ。引数いつも間違えるけど、(list, str)
です。listの中のstrの頻出をみるって感じで覚えようっと。6/4追記(やり方忘れてた)
あとはMap/HashMapの使い方やループの方法、値の取得までは覚えておきたい
Java HashMap(連想配列) - ' P '
グリッド系
- B - Minesweeper
グリッド系の探索。自分の周りに動いたら座標がどう変わるのかの指標を別途用意しておくと楽.
強者だとコンテストに参加する前にその指標はあらかじめ用意しておくらしい...
あとはchar - intの変換も押さえておくこと。
グリッド系の探索 - ' P '
Java String型からInt型変換とか, vice versa (あとChar to Int/ int to char & char to String) - ' P '
集合の要素の個数(数学系)
- B - Between a and b ...
入力される値が最大18桁なので、まず普通にloopさせて回答を得ることはできない。
じゃあどうするか?ということなんですけど、数学的な式には無知すぎるので、こういう問題が出たら、こう解く、と覚えておくほかなさそう。
例をずっとみていて、もしかしたら閃くかもだけど期待は薄い。
もしAが0なら、b/x+1 を行う それ以外は、 b/x - (a-1)/x を行う
これで回答は出せる...追記 6/5
やはりちゃんと理解していないと再度同じ問題を解こうとしても、あれ?これどーするんだっけ...となりますね
というわけで下記記事を書きました。理解してしまえばなんてことない問題です... (AtCoderの解説が数式アレルギーには難しすぎるんだよなあ...)
集合の要素の個数 - ' P '
周期性やパターンを見つける系
- B - Choose Integers
- B - Trained?
周期性やパターンを導き出せるかどうかの問題。思考停止せずに、計算結果や仮説を立てて考察してみることが大切。
周期性を見つけ出す - ' P '
累積和
B - Choose Integers
グリッド系の問題だけど実は全探索なので、惑わされないようにC - Attention
全探索してるとTLEになります。累積和をうまく使って解く必要がある。
累積和 - ' P '
1000000007系
B - Training Camp
上記は数学系とも言える。その知識がないとまず解けない...
1000000007系 - ' P 'B - Multiplication 2
BigIntegerを使用すれば特に難しくないので、使い方を押さえておくこと
Java BigInteger & BigDecimal - ' P '