(atcoderでタイムアウト!
その場合は、「計算量」を意識するといいかもしれません。
後は、たとえばいわゆる蟻本と呼ばれる書籍を参考にするとかですね。
(すでにお持ちで、参考にしていらっしゃるならスルーで)
AtCoderはあまりやっていませんが、A問題やB問題はそのまま解けばいいタイプが多いですが、
B問題のいくつかやC問題からは計算量を意識しないとできないような問題が多い気がします。
たとえば、解こうと思えば貪欲法とかでもイケなくはないですが、TLEになったりとか。
その場合は、メモ化とかを使って出来る限り計算量を落とせないかを考えるといいみたいです。
(ただし私はまだ……)
全く模範的なコードが書けません。
それは問題ない気がします。プログラミングって、結局、「仕様に沿っていて、ユーザが満足すればいい」のです。(極論ですが)
そりゃ、綺麗なコードを書くように心がけるべきですが。
ただ、一つの処理でも、極論をすればいくらでも実装はあるのです。
たとえば、Hello World。普通はC言語だとprintf関数に相当するものに渡すだけですが、
考えると、
■ "Hello World"を文字列として変数等(C言語だと配列) にセットしてそれを渡す
■ "Hello" と " " と "World" をそれぞれ変数等に入れてそれを渡す
■ "Hello " と "World" をそれぞれ入れて...
■ "Hello World"を変数等に入れて一文字ずつ表示する
...
とかみたいにやろうと思えばできますよね。(ただ、普通はそんなまどろっこしいことはせずに一回でやる)
なので、「模範解答」になる必要はありません。
仕様に沿っていないと話になりませんし、実行結果が異様に遅い場合も話になりませんが、
基本的にはそれらを守っていればOKだと思います。
つか、WindowsとかのようなOSとかですら、毎年のようにアップデートやら修正やらをしています。
ましてや、たった一回で、スペルミスもせずにやるのは無理です。
どんなときにif-else文ではなくswitch-case文を使うか、とかclassで管理すべきか否かを間違えまくって全然きれいにコード書けんし
経験じゃないでしょうか。
後は知識。
質問者さんはどのように学習しているのでしょうか。
たとえば、「単にAtCoderの問題を解くだけ」なのか、「本を読むだけ」なのか、
「実際に何か作品を作る」なのかとか。
オススメは『何か作る』です。
作る事で、「いつ使うべきか」「作法」等を学べます。
if文は「条件で分岐させる場合」ですが、switch...caseは言語によっては『複雑な条件式は不可能』だったりします。(現にC言語やC++だと複雑な条件式は不可能)
たとえば
C
1int a = 100;
2int b = 2;
3switch( a ){
4 case 100 && b == 2:
5 // 何らかの処理
6 break;
7 case 200 && b == 3:
8 // 何らかの処理
9 break;
10 case 300 && b == a+1:
11 // 何らかの処理
12 break;
13}
のような複雑な条件式はできません。
( a が 100 で b が 2 である場合... とかのような )
この場合はif文でしかできません。
classで管理すべきか否か
競技プログラミングとかでは考えませんね。(そんな余裕ない…)
時間があればいじるかもしれませんが。
やるとしたら、経験的に。ですかね。
「これをオブジェクトにしたら楽そう……」と思ったらOOPで、そうじゃないなら非OOPで。
後のお勧めは、「以前作ったものを改良する」「自分用のライブラリを作る」でしょうか。
たとえば、C言語 + Windows API だと、MessageBoxは文字列しか受け取りません。(表示部)
でもint型を埋め込みたい事がありますね。
これを
C++
1int MsgBox( const std::string &s ){
2 return MessageBox( nullptr, s.c_str(), "", MB_OK );
3}
のように関数とかにしておけば若干楽になるっていう感じで。
それと昔作ったものでも今振り返ると「うわぁ……ダセぇ……」ってなります。
なのでそれを修正するとかですね。
つまり、「単に、単発で作るのではなく、保守ありきで組んでいく」という感じでしょうか。
それなら、必要に駆られれば自分でも調べますから。