部内バチャ解説 2020.09.10

## [A - Two Coins](https://atcoder.jp/contests/abc091/tasks/abc091_a)

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

int main() {
  // 入力部(a,b,c)
  int a, b, c;
  cin >> a >> b >>c;

  // 所持金は a と b の合計
  // この所持金が 価格c 以上なら "Yes", 違うなら "No"
  if(a + b >= c) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }
}
```


## [A - ι⊥l](https://atcoder.jp/contests/abc058/tasks/abc058_a)

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

int main() {
  // 入力部(a,b,c)
  int a, b, c;
  cin >> a >> b >>c;

  // 問題中の比較をそのまま利用してOK
  if(b - a == c - b) {
    cout << "YES" << endl;
  } else {
    cout << "NO" << endl;
  }
}
```

## [A - Three-letter acronym](https://atcoder.jp/contests/abc059/tasks/abc059_a)

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

int main() {
  // 入力部(s1,s2,s3)
  string s1, s2, s3;
  cin >> s1 >> s2 >> s3;

  // 取得した文字列の1文字目を取得してそれを大文字に変換する。
  // ○○.at(0) で1文字目を char型(一文字のみ) で取得。
  // これから32を引くことで、それぞれの小文字アルファベットに対する大文字のASCIIコードを取得。
  // ここで取得したASCIIコードを数字ではなく、文字として出力するために char型 にキャスト変換する。
  // ちなみに char型 と int型 の演算は char型 が int型 に変換されてから計算される。
  cout << (char)(s1.at(0)-32) << (char)(s2.at(0)-32) << (char)(s3.at(0)-32) << endl;
}
```

## [A - Rotation](https://atcoder.jp/contests/abc077/tasks/abc077_a)
### 回答例1 (reverse関数を利用する)
```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  // 入力される(c11,c12,c13)をs1, (c21,c22,c23)をs2として入力
  string s1, s2;
  cin >> s1 >> s2;

  // s2をreverse関数を用いて反転させる
  reverse(s2.begin(), s2.end());

  //「s1」と「反転させたs2」が同じなら 'YES' と表示
  if(s1 == s2) {
    cout << "YES" << endl;
  } else {
    cout << "NO" << endl;
  }
}
```

### 回答例2 (reverse関数を使用しないパターン)
```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  // 入力される(c11,c12,c13)をs1, (c21,c22,c23)をs2として入力
  string s1, s2;
  cin >> s1 >> s2;

  // s1の1文字目(c11) と s2の3文字目(c23) が同じ
  // かつ
  // s1の2文字目(c12) と s2の2文字目(c22) が同じ
  // かつ
  // s1の3文字目(c13) と s2の1文字目(c21) が同じ
  //
  // この条件を満たす時、180°回転させた時に、元のマス目と一致する。
  if(s1.at(0) == s2.at(2) && s1.at(1) == s2.at(1) && s1.at(2) == s2.at(0)) {
    cout << "YES" << endl;
  } else {
    cout << "NO" << endl;
  }
}
```

## [B - 81](https://atcoder.jp/contests/abc144/tasks/abc144_b)

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

int main() {
  // 入力部(N)
  int N;
  cin >> N;

  // 条件を満たすパターンの数をカウントする変数
  int cnt = 0;

  // 1~9までのループを行う。
  for(int i = 1; i < 10; i++) {

    // iでちょうど割り切れて、Nをiで割った結果が9以下の時、
    // この i と N/iの演算結果 に積は N になり、
    // Nをiで割った結果が9以下なので問題文の条件を満たす。
    if(N % i == 0 && N / i < 10) {
      //cnt(条件を満たすパターンの数をカウントする変数) に1を加算。
      cnt++;
    }
  }

  // cntが0でないなら 'Yes' となる。
  // つまり、1度でもfor文内のif文の条件を満たしているなら 'Yes' と表示。
  if(cnt) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }
}
```

## [B - Christmas Eve Eve](https://atcoder.jp/contests/abc115/tasks/abc115_b)
### 回答例1 (sort関数を利用しないパターン)
```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  // 入力部(N)
  int N;
  cin >> N;

  // 入力部(p1, p2, ... pN)
  vector<int> p(N);
  for(int i = 0; i < N; i++) {
    cin >> p.at(i);
  }

  // sum は 購入する品物の合計金額。
  // highest は 購入する品物の中で最高価格の景品の価格。
  int sum = 0, highest = 0;

  for(int i = 0; i < N; i++) {
    // sum に 価格の値段を加算。
    sum += p.at(i);

    // highest(現状の探索範囲での最高価格) と 今の景品の価格 を比較し、高い方を highest に格納。
    highest = max(p.at(i), highest);
  }

  // sum(景品の合計金額) からhighest(最高価格の景品の価格)の半額の値 を引く。
  cout << sum - highest/2 << endl;
}

```

### 回答例2 (sort関数を利用したパターン)
```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  // 入力部(N)
  int N;
  cin >> N;

  // 入力部(p1, p2, ... pN)
  vector<int> p(N);
  for(int i = 0; i < N; i++) {
    cin >> p.at(i);
  }

  // 配列pをソート。
  sort(p.begin(), p.end());

  // 配列pの最後尾(最も定価が高い品物の価格)の半額 を最初から引いておく。
  // 意味的には商品の合計を求める前に割引をしているもの。
  int sum = -p.at(N-1) / 2;

  // 全ての品物の価格を sum に加算。
  for(int i = 0; i < N; i++) {
    sum += p.at(i);
  }

  cout << sum << endl;
}

```

## [B - 105](https://atcoder.jp/contests/abc106/tasks/abc106_b)
```cpp
#include <bits/stdc++.h>
using namespace std;

int main() {
  // 入力部(N)
  int N;
  cin >> N;

  // 約数をちょうど8つ持つ奇数の個数をカウントする変数。
  int ans = 0;

  // 奇数のみをカウントするので1からスタートして2ずつ増やす。
  for(int i = 1; i <= N; i+=2) {
    // i の約数の個数をカウントする変数。
    int cnt = 0;

    // 1以上i以下の範囲で全探索。
    for(int j = 1; j <= i; j++) {
      // i % j == 0 の場合の時の j は iの約数 である。
      if(i % j == 0) {
        cnt++;
      }
    }

    // 約数がちょうど8個の場合、ansに1を加算
    if(cnt == 8) {
      ans++;
    }
  }

  // ansは 約数をちょうど8つ持つ整数の個数をカウントする変数 なのでそのまま出力。
  cout << ans << endl;
}
```