[AtCoder]ABC 130A – Rounding ~ 134[C++]

プログラミング

引き続き、AtCoderの過去問をC++で解いていきます。ABC 124A – Buttonsから。

ABC 130A – Rounding

問題

X,Aは0以上9以下の整数です。
XがA未満の時0、A以上の時10を出力してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;

int main() {
  int X, A;
  cin >> X >> A;

  if(X < A){
    cout << 0 << endl;
  }else {
    cout << 10 << endl;
  }
}

問題文の通りですね。

ABC 131A – Biscuit Generator

問題

すぬけ君の管理する研究室の扉にはロックがかかっており、解錠にはセキュリティコードを入力する必要があります。
セキュリティコードは4桁の数字列です。セキュリティコードが「入力しづらい」とは、同じ数字が連続する箇所が存在することを言います。
現在のセキュリティコードSが与えられます。Sが「入力しづらい」なら Bad を、そうでなければ Good を出力してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  cin >> S;

  int S_before = S.size();
  S.erase(unique(S.begin(), S.end()), S.end());

  if(S_before == S.size()){
    cout << "Good" << endl;
  }else {
    cout << "Bad" << endl;
  }
}

久々のunique関数の出番です。unique関数は“隣接する“重複要素を削除するので、もし、同じ数字が続いたりすると、削除します。なので、unique関数をかける前と後の文字数を比較すれば、いいですね。もし、unique関数をかける前後の文字数が同じなら、同じ数字が連続する箇所が存在しないということなので、”Good”を出力します。

ABC 132A – Fifty-Fifty

問題

長さ4の英大文字からなる文字列Sが与えられます。 Sがちょうど2種類の文字からなり、かつ現れる各文字はちょうど2回ずつ現れているかどうかを判定してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  cin >> S;

  if((count(S.begin(), S.end(), S[0]) == 2) 
      && (count(S.begin(), S.end(), S[1]) == 2)
      && (count(S.begin(), S.end(), S[2]) == 2)
      && (count(S.begin(), S.end(), S[3]) == 2)){
    cout << "Yes" << endl;
  }else {
    cout << "No" << endl;
  }
}

ゴリ押しです。一文字ずつ、文字数に含まれる個数を確認しています。どの文字も文字列に含まれる数が2なら、条件を満たします。
他の人はsortした後に、1文字目と2文字目が等しい時かつ2文字目と3文字目が等しくないかつ3文字目と4文字目が等しい時という条件で振り分けていますね。そっちの方が、コードはすっきりしてますね。どちらにしても、ifの条件を並べることに変わりはないですけど。

ABC 133A – T or T

問題

私たちはN人で旅行しようとしており、その交通手段として電車とタクシーがあります。
電車を使うと1人あたりA円かかります。
タクシーを使うとN人でB円かかります。
全員の交通費の合計は最小でいくらになるでしょうか。

自分の回答

#include <bits/stdc++.h>
using namespace std;

int main() {
  int N, A, B;
  cin >> N >> A >> B;

  cout << min(N * A, B) << endl;
}

電車代(N✖️A)とタクシー代(B)を比較して、低い方を出力すればいいですね。

ABC 134A – Dodecagon

問題

半径aの円に内接する正十二角形の面積は 3a^2であることが知られています。
整数rが与えられるので、半径rの円に内接する正十二角形の面積を求めて下さい。

自分の回答

#include <bits/stdc++.h>
using namespace std;

int main() {
  int r;
  cin >> r;

  cout << 3 * r * r << endl;
}

3r^2をすればいいだけですね。pow関数を使って、3 * pow(r, 2)と書くこともできます。

タイトルとURLをコピーしました