引き続き、AtCoderの過去問をC++で解いていきます。
ABC 044A – 高橋君とホテルイージー
問題
1軒のホテルがあります。 このホテルの宿泊費は、次のようになっています。
- 最初のK泊までは、1泊あたりX円
- K+1泊目以降は、1泊あたりY円
高橋君は、このホテルにN泊連続で宿泊することにしました。 高橋君の宿泊費は合計で何円になるか求めてください
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int lodging_all, lodging_first, price_first, price_second;
cin >> lodging_all >> lodging_first >> price_first >> price_second;
int price_all;
if (lodging_all >= lodging_first){
int lodging_second = lodging_all - lodging_first;
price_all = lodging_first * price_first + lodging_second * price_second;
}else {
price_all = lodging_all * price_first;
}
cout << price_all << endl;
}
考慮しなければいけないのは、宿泊費が変わるK泊目よりも宿泊数Nが少ない時です。
自分のコードで言うと、値段が変わった後の宿泊数(lodging_second)がマイナスになってしまうので、計算が合わなくなります。
なので、K泊目が宿泊数Nを大きい時と小さい時で場合わけをすればいいのです。
ABC 045A – 台形 / Trapezoids
問題
上底の長さが a、下底の長さが b、高さが hの台形があります。台形の面積を求めてください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, h;
cin >> a >> b >> h;
int area;
area = (a + b) * h / 2;
cout << area << endl;
}
台形の面積は、(上辺+下辺) ✖️ 高さ÷2 です。
これくらいなら、C++でも簡単にかけますね。
ABC 046A – AtCoDeerくんとペンキ / AtCoDeer and Paint Cans
問題
A君はペンキをこれまでに3つ買いました。おととい買ったペンキの色は a, 昨日買ったペンキの色は b , 今日買ったペンキの色はcです。各ペンキの色は1以上100以下の整数で表されます。 A君はわすれんぼうなため、同じ色のペンキを買ってしまっていることがあります。A君が買ったペンキの色の種類の個数を教えてあげてください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
vector<int> v{a,b,c};
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
cout << v.size() << endl;
}
新しい要素がたくさん出てきました。
vector<int>
配列要素を生成します。
vector<int> v{a,b,c};
とすることで、配列vにa,b,cという初期値を配置して生成します。
sort
文字通り、配列を降順に並び替えます。何故、sortするかというと、uniqueを使うためです。あとで説明しましょう。
unique
“隣接する“重複要素を削除します。そう、隣接する要素だけです。例えば配列内が[1,2,1]になっていると、1が重複しているにも関わらず、1は削除してくれません。なので、その前にsortをかけて、順番を並び替えています。
また、要素を削除すると、?のゴミが残ります。[1,1,2] => [1,2,?]となり、配列の長さが変化しません。そこで、eraseを使います。
erase
指定した要素を削除します。この場合、uniqueを使ったことによって発生したゴミ(?)を削除しています。これによって、重複を削除した配列が得られました。
最後にsize()で配列の長さを出力して、答えとなります。
C++の色々な要素が学べるいい問題でした。