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問題を解いていこうと思います。