[AtCoder]ABC 044A 高橋君とホテルイージー ~ 46[C++]

プログラミング

引き続き、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++の色々な要素が学べるいい問題でした。

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