リブlab

理系大学生のIT・電気・大学・趣味についての日記

AtCoderの良解答からみるプログラミングのテクニック01(ビギナー向け) C++

 最近競技プログラミングに興味を持ち始めてみました。
ここから、学んだことを共有したいと思います。(ビギナー向け)
 途中に他の方のコードを引用しますが、そのコードの著作権はそのコードを書いた方が有しています。
 元のコードが見たい場合は問題名 提出#〇〇〇〇〇で検索をすれば見ることができます。
 今回から第九回までは提出#〇〇〇〇〇のかたちで紹介させていただきます。が十回目からはリンクを張ることにしました。検索してもでず、地道に番号から探さないと見つけられないみたいだからです。

※注 スマホだとコードは見にくいのでPCモードかPCで見たほうが良いです。

 

AtCorderとは

 AtCorderが何なのかは

https://qiita.com/drken/items/fd4e5e3630d0f5859067

 ここに全て(始め方も)が詰まってます。この記事に沿って僕の記事も進めていきます。
 なので、詰まった時や、他の人の解答を見たいけど似たような解答が多くて探すのが大変って時に見に来るのがいいかもしれません。

At Corder で見つけた良解答から得たもの

 ABC064_A

 三つの整数が与えられ、左から整数を読んだときにこれが 4の倍数であるか判定しなさい。という問題です。

 テク1 - 条件演算子の効果と倍数判定のコツ

 提出 #4187968の中に

((g*10+b)%4)? "NO":"YES")

 というコードがあります。僕は

#include<iostream>
using namespace std;
int main()
{
  int valuePlace100, valuePlace10, valuePlace1;
  cin >> valuePlace100 >> valuePlace10 >> valuePlace1;
  int sum = (valuePlace100)*100+(valuePlace10)*10+valuePlace1;
  if(sum % 4 == 0)
  cout << "YES";
  else
  cout << "NO";
  return 0;
}

 という、あまり何も考えてない(命名だけしっかりしてる。(つもり))コードを書きました。

 僕のは、与えられた整数を左から100倍,10倍してそれらを足すことで三桁の整数を作りました。そして、それを倍数判定の基本、「余りを求める」を利用して解きました。

 別のやり方として、stringで整数をまとめてからint型に変換するというやり方もあります。

 で、ご紹介した解法ですが、条件演算子を使って可読性が高くなっています。
さらに(g*10+b)%4によって、今回の場合だと百の位は倍数判定において考慮しなくていいことが分かります。

 Tips01

 競プロにおいて役に立つ#include <bits/stdc++.h>という記述があります。
これによって、C++の標準ライブラリを一行で全てインクルードすることができます。


 ABC082_A

 二整数が与えられ、それらの平均を少数点切り上げで出力せよという問題

 テク2 - 小数点切り上げを簡単に
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int a,b;
  
  cin >> a;
  cin >> b;
  
  if (0 == (a + b) % 2) {
    cout << (a + b) / 2 << endl;
  } else {
    cout << (a + b) / 2 + 1 << endl;
  }
  

 個人的におすすめはしたくない解答です。なぜなら、長い。それに尽きますね。
見たら分かりますが、2で割り切れなかったら1を足して平均をとるというコードです。

 今回は、こちらのコードがすっきりしていると思います。

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
  int a, b;
  cin >> a >> b;
  int c = a + b;
  int result = (c + 1)/2;
  cout << result << endl;
  
  return 0;
}

 はい、このようにわざわざ場合分けしなくても一発で出ます。
これは与えられた数がn整数の場合だと、(平均値) =((全体の和) + (n - 1)) / n と書けます。
 このように記述することで簡潔に平均値を切り上げるコードが書けます。どうしてこのように書けるのかは、分配法則を適用して値をいくつか代入してみると分かるのではないでしょうか。

 Tips02

 #defineを使うことで記述を簡単にする。
例)#define R cin>>

 Tips03

 templateや関数を作っておく。

 Caution01

 YesやNoを出力するとき、YESだったりNOだったりしてWAになることがあるので気を付けましょう。(血涙)

おわり

 以上、ABC 064とABC 082の解説でしたー。

次回はここをクリック