引き続き、AtCoderの過去問をC++で解いていきます。ABC 124A – Buttonsから。
ABC 124A – Buttons
問題
2個のボタンがあり、大きさはそれぞれA,Bです。
大きさXのボタンを押すと、X枚のコインを獲得し、そのボタンの大きさが1小さくなります。
あなたは、いずれかのボタンを押すことを2回行います。 同じボタンを2回押しても構いません。
最大で何枚のコインを獲得できるでしょうか。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int A, B;
cin >> A >> B;
if(A == B){
cout << A + B << endl;
}else {
cout << max(A, B) + (max(A, B) - 1)<< endl;
}
}
まずはAとBの差を見ます。もし、AとBが等しかった場合、AとBを押すので、答えはA+Bとなります。もし、二つの値が違かった時は、大きい方のボタンを二回押せばいいです。例えば、A=6,B=5だった時、最初にAを押して、A=5になりますが、Bと同じ値なので、どちらを押しても同じ答えになります。なので、大きい方のボタンを二回押すのが答えとなります。
ABC 125A – Biscuit Generator
問題
ビスケット生産装置を起動すると、起動してからA秒後、2A秒後、3A秒後、…… (Aの倍数秒後) にB枚ずつビスケットを生産します。
ビスケット生産装置を起動してからT+0.5秒後までに生産されるビスケットの合計枚数を求めてください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int A, B, T;
cin >> A >> B >> T;
cout << T / A * B << endl;
}
生産回数をT/Aで求めて、一回あたりのビスケットの生産数Bをかければ、答えとなります。
ABC 126A – Changing a Character
問題
A
, B
, C
からなる長さNの文字列Sと、1以上N以下の整数Kが与えられます。 文字列SのK文字目を小文字に書き換え、新しくできたSを出力してください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int N, K;
cin >> N >> K;
string S;
cin >> S;
S[K-1] = S[K-1] + 0x20;
cout << S << endl;
}
文字コードの加減算を使って大文字から小文字に変換しています。もし、小文字から大文字に変換したかったら、- 0x20をすればいいです。
ABC 127A – Ferris Wheel
問題
A歳の高橋君が観覧車に乗ろうとしています。
この観覧車は、13歳以上が乗るにはB円 (Bは偶数) かかりますが、6歳以上12歳以下の人はその半額で乗ることができ、さらに5歳以下の人は無料で乗ることができます。
高橋君が観覧車に乗るには何円かかるかを求めてください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int A, B;
cin >> A >> B;
if(A >= 13){
cout << B << endl;
}else if (A >= 6){
cout << B / 2 << endl;
}else {
cout << 0 << endl;
}
}
Aが13以上の時はBを、Aが6以上12未満の時はB/2、それ以下の時は0を出力します。
ABC 128A – Apple Pie
問題
林檎がA個、林檎の欠片がP個あります。
林檎1個は、砕くことで林檎の欠片3個になります。また、林檎の欠片2個を鍋で煮込むことで、アップルパイが1個作れます。
今ある材料で作れるアップルパイの最大数を求めてください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int A, P;
cin >> A >> P;
cout << (A * 3 + P) / 2 << endl;
}
まずは、りんごの欠片が何個になるのかを求めます。(A * 3 + P)で欠片の総数を求めています。そして、その値を2で割ると答えになります。
ABC 129A – Airplane
問題
空港A, B, Cがあり、それぞれの空港の間では、双方向に飛行機が運航しています。
空港A, B間の飛行時間は片道P時間、空港B, C間の飛行時間は片道Q時間、空港C, A間の飛行時間は片道R時間です。
いずれかの空港からスタートして他の空港に飛行機で移動し、さらにそのどちらでもない空港に飛行機で移動するような経路を考えます。
飛行時間の和は最短で何時間になるでしょうか。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int P, Q, R;
cin >> P >> Q >> R;
vector<int> n{P, Q, R};
sort(n.begin(), n.end());
cout << n[0] + n[1] << endl;
}
難しいことは考えず、小さい値2つを足算すれば答えとなります。