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
直後に置くことができます。
コメント