【競プロ精進ログ】ABS編<4>

zuka

APG4bを終えたので次はABSです。

本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために,積極的にアウトプットしていく作戦です。これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。

目次

本記事の概要

Atcoderが公表しているc++の入門記事の内容を1からさらっていくものです。今回はABC081B - Shift onlyです。

実装

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
using namespace std;

int main() {
  int N = 0;
  cin >> N;
 // 結果を格納する変数
  int ans = 0;
 // while文を抜け出すフラグ
  bool judge;
  vector<int> A(N);
  judge = true;
  rep(i, N){
    cin >> A[i];
    if (A[i] % 2 == 1) judge=false;
  }
  if (judge == false){
    cout << 0 << endl;
    return 0;
  }
  else{
    while(true){
      ans++;
      rep(i, N){
        A[i] /= 2;
        if (A[i] % 2 == 1) judge=false;
      }
      if (judge==false) break;
    }
    cout << ans << endl;
    return 0;
  }

}

ポイント

今回おさえるべき内容

 for文を用いた全探索

少しずつ難しくなってきました。今回はfor文を用いた全探索をしてみようという問題です。while文を利用するため,続行するか否かを表すjudgeフラグを用意してbreakする条件分岐を用意してあげる必要があります。

また,最初に全ての要素が割り切れるかどうかの判断をしてあげることで,Aの全ての要素が2で割り切れることは確定しています。ですので,while文の中でansのインクリメント(+1)をwhile直後に置くことができます。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

※ Please enter your comments in Japanese to distinguish from spam.

目次