[AtCoder]ABC 147A – Blackjack ~ 156[C++]

プログラミング

AtCoderのA問題の過去問をC++で解いていきます。ABC 147A – Blackjackから解いていきます。

ABC 147A – Blackjack

問題

3個の整数A1, A2, A3 が与えられます。
A1+A2+A3が22以上ならbust、21以下ならwinを出力してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int A, B, C;
  cin >> A >> B >> C;

  if(A + B + C <= 21){
    cout << "win" << endl;
  }else {
    cout << "bust" << endl;
  }
}

三つ足した数が22以下なら、”win”を23以上なら”bust”を出力します。

ABC 148A – Round One

問題

高橋君はペーパークイズを解いています。高橋君はすらすらと解いていき、残すは最終問題のみとなりました。
この問題は、答えが1,2,3のいずれかである3択問題です。
高橋君は超能力によって、AとBが誤答であることがわかりました。
この問題の答えを出力してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int A, B;
  cin >> A >> B;

  cout << 6 - A - B << endl;
}

1,2,3を全て足すと6になるので、6から与えられた値A,Bを引くと、答えになります。

ABC 149A – Strings

問題

英小文字のみからなる2つの文字列S,Tが与えられます。これらの文字列をT,Sの順に空白を空けずに連結し、できる文字列を出力してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string S, T;
  cin >> S >> T;

  cout << T << S << endl;
}

出力する時にこのようにすれば、つなげて出力できます。

ABC 150A – 500 Yen Coins

問題

高橋君は500円玉をK枚持っています。 これらの総額がX円以上である場合はYesを、そうでない場合はNoを出力してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int K, X;
  cin >> K >> X;

  if(500 * K >= X){
    cout << "Yes" << endl;
  }else {
    cout << "No" << endl;
  }
}

500にKをかけて、Xと比べて、Xより高ければ”Yes”を出力すればいいですね。

ABC 151A – Next Alphabet

問題

zでない英小文字Cが与えられます。アルファベット順でCの次の文字を出力してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string C;
  cin >> C;

  C = C[0] + 0x1;

  cout << C << endl;
}

文字コードを利用して、一つ隣の文字にすればいいですね。ただ、C[0]と指定しないと型が違ってうまくいきません。

ABC 152A – AC or WA

問題

高橋君は、プログラミングコンテストAXC001に参加しており、問題Aにコードを提出しました。
この問題にはN個のテストケースがあり、すべてのテストケースに正解した場合のみ提出はACとなります。
高橋君の提出は、N個のテストケースのうちM個のテストケースに正解しました。
高橋君の提出がACとなるか判定してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int N, M;
  cin >> N >> M;

  if(N == M){
    cout << "Yes" << endl;
  }else {
    cout << "No" << endl;
  }
}

今までで一番簡単ですね。if文の基礎を固めるには絶好の問題です。

ABC 153A – Serval vs Monster

問題

サーバルはモンスターと戦っています。
モンスターの体力はHです。
サーバルが攻撃を1回行うとモンスターの体力をA減らすことができます。 攻撃以外の方法でモンスターの体力を減らすことはできません。
モンスターの体力を0以下にすればサーバルの勝ちです。
サーバルがモンスターに勝つために必要な攻撃の回数を求めてください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int H, A;
  cin >> H >> A;

  int count =0;

  while(H < 0){
    H = H - A;
    count += 1;
  }
  cout << count << endl;
}

whileを初めて使いました。ただ、コードだと、Hの値が大きくてAの値が小さいと、処理に時間がかかりそうですね。

while
while(ループ条件){
処理内容
}

ABC 154A – Remaining Balls

問題

高橋君はペーパークイズを解いています。高橋君はすらすらと解いていき、残すは最終問題のみとなりました。
この問題は、答えが1,2,3のいずれかである3択問題です。
高橋君は超能力によって、AとBが誤答であることがわかりました。
この問題の答えを出力してください。

自分の回答

#include <bits/stdc++.h>
using namespace std;
 
int main() {
  string S, T, U;
  int A, B;
  cin >> S >> T >> A >> B >> U;

  if(S == U){
    A = A - 1;
  }else {
    B = B - 1;
  }

  cout << A << " " << B << endl;
}

Uで指定された方のボールの数から1引いて出力します。

ABC 155A – Poor

問題

3つ組の数について、ある2つが等しく、残りの1つがそれらと異なるとき、その3つ組を「かわいそう」であるといいます。
3つの整数A,B,Cが与えられるので、この3つ組がかわいそうであればYesを、そうでなければNoを出力してください。

自分の回答

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

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

  vector<int> n{A, B, C};
  sort(n.begin(), n.end());
  n.erase(unique(n.begin(), n.end()), n.end());

  if(n.size() == 2){
    cout << "Yes" << endl;
  }else {
    cout << "No" << endl;
  }
}

要は、2種類の数字が使われている時に”Yes”を出力すればいいですね。なので、uniqueで重複を消して、配列の大きさが2の時は”Yes”、それ以外の時は”No”を出力すればいいですね。

unique
隣接する“重複要素を削除します。そう、隣接する要素だけです。例えば配列内が[1,2,1]になっていると、1が重複しているにも関わらず、1は削除してくれません。なので、その前にsortをかけて、順番を並び替えています。
また、要素を削除すると、?のゴミが残ります。[1,1,2] => [1,2,?]となり、配列の長さが変化しません。そこで、eraseを使います。

erase
指定した要素を削除します。この場合、uniqueを使ったことによって発生したゴミ(?)を削除しています。これによって、重複を削除した配列が得られました。

ABC 156A – Beginner

問題

高橋君はプログラミングコンテストサイト「ButCoder」の会員です。
ButCoderの会員には2つのレーティング内部レーティング表示レーティングが割り当てられています。
表示レーティングは、その会員のコンテスト参加回数が10以上のときは内部レーティングに等しく、そうでないときは、会員のコンテスト参加回数を KK として、内部レーティングから100×(10−K)を引いたものになります。
高橋君のコンテスト参加回数がNで表示レーティングがRであるとき、高橋君の内部レーティングを求めてください。

自分の回答

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

int main() {
  int N, R;
  cin >> N >> R;

  if(N >= 10){
    cout << R << endl;
  }else {
    cout << R + (100 * (10 - N)) << endl;
  }
}

問題文の通りにif文の条件を分岐をしていけばいいですね。

終わりに

ここまでで、存在するA問題を全て解き終わりました。次からは、B問題を解いていこうと思います。

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