ABC081B Shift only
Shift only
ABC081B Shift only
AtCoder Beginners Selectionより。
黒板にN個の正の整数が書かれており、その整数がすべて偶数のときのみ、「すべての整数を2で割ったものに置き換える」という操作を行うことができる。
整数の個数Nと正の整数A(1), A(2), ..., A(N)が入力から与えられた場合、上記の操作を何回行うことができるか、という問題です。
判定をcmp関数でやらせて一つでも奇数が見つかった時点でフラグを立てて抜けるという操作を行っていますが、別に関数にする必要はなかったような気がします。
#include <iostream>
#include <vector>
// geschrieben von Beliar698ma
int cmp (int n, int &x, int &f, std::vector<int> &v) {
for (int i = 0; i < n; i++) {
if (v.at(i) % 2 == 0) {
v.at(i) /= 2;
x++;
} else if (v.at(i) % 2 != 0) {
f++;
break;
}
}
return 0;
}
int main() {
int N;
std::cin >> N;
std::vector<int> vec(N);
for (int i = 0; i < N; i++) {
std::cin >> vec.at(i);
} //各数値入力完了
int count = 0;
int flag = 0;
cmp(N, count, flag, vec);
while(!(flag)) {
cmp (N, count, flag, vec);
}
count /= N;
std::cout << count << "\n";
}
入力例(標準入力)
3 8 12 40
出力例(標準出力)
8, 12, 40はすべて偶数なので1回2で割って4, 6, 20
→4, 6, 20はすべて偶数なのでもう1回2で割って2, 3, 10
→奇数3が含まれているので操作不可能ということで答えは2回です。
→4, 6, 20はすべて偶数なのでもう1回2で割って2, 3, 10
→奇数3が含まれているので操作不可能ということで答えは2回です。
2
動作が気になりましたらpaiza.ioなどで上記のコードをテストしてみてください。