AtCoderに登録したら解くべき精選過去問10問の類題をC++で解いてみた(その3)
前回の続き。
ABC 081 B - Shift Onlyの類題を解きます。
ABC 068 B - Break Number
- 指定された数値を1ずつループで処理しながら2で割り切れる数をもとめる。
- max値とmaxカウンターを用意しておいて、そのカウンター以上割り切れる回数が多い数がでてきたら更新する。
#include <iostream> using namespace std; int main() { int i,j,input,counter; int max = 0; int maxcounter = 0; cin >> input; for(i = 1;i <= input; i++) { j = i; counter = 0; while(j > 1) { if(j % 2 == 0) { j /= 2; counter++; }else { break; } } if(counter >= maxcounter) { max = i; maxcounter = counter; } } cout << max << endl; return 0; }
ABC 073 B - Theater
- 団体客毎にループで処理
- 各ループ毎の人数を足し算していって、結果を出力
#include <iostream> using namespace std; int main() { int i,j,first,last,groups,counter,num_people; cin >> groups; for(i = 1; i <= groups; i++) { cin >> first >> last; counter += last - first + 1; } cout << counter << endl; return 0; }
ABC 072 B - OddString
- 入力された中から奇数番の文字のみ取得
- C++だとStringを配列としてもてるので、配列の番号で偶数番(配列は0からはじまるので)を文字列結合させる
#include <iostream> #include <string> using namespace std; int main() { string input; string output = ""; int i; cin >> input; for(i = 0; i < input.length(); i+=2) { output += input[i]; } cout << output << endl; return 0; }
ABC 053 B - A to Z String
- 文字列の中からAを見つけて、そこからZまでの長さの最大値をもとめる
- 何も考えずにAを見つけたら文字列の最後まで調べてZを見つけるなんてことをやったら時間オーバーになった
- よく考えれば最初にAを見つけたらその後にAがきたとしてもそれが最大の長さになるわけじゃないので、見つけ次第Zまでの長さを求めた後、break文を挟んだら通った。
#include <iostream> #include <string> using namespace std; int main() { string input; int i,j; int stringlength = 0; cin >> input; for(i = 0; i < input.length(); i++) { if(input[i] == 'A'){ for(j = i; j < input.length(); j++) { if(input[j] == 'Z') { stringlength = j - i + 1; } } break; } } cout << stringlength << endl; return 0; }