AtCoder 勉強記録[C++] その4

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Climbing Takahashi
[B - Climbing Takahashi](https://atcoder.jp/contests/abc235/tasks/abc235_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n, h;
  cin >> n;
  ll res = 0;
  rep(i,n) {
    cin >> h;
    if(res < h) res = h;
    else break;
  }
  cout << res << endl;
}
```
### 解法
台の高さを保持しておく変数を作っておく。for文ループで現在の高さより次の高さのほうが高いときはその高さを代入して続行、そうでないときはループを抜ける。
## B - Who is missing?
[B - Who is missing?](https://atcoder.jp/contests/abc236/tasks/abc236_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n, a;
  cin >> n;
  map<ll,ll> res;
  for(int i = 0; i < 4*n-1; i++) {
    cin >> a;
    res[a]++;
  }
  for(auto const& [k,v]:res){
    if(v == 3) {
      cout << k << endl;
      exit(0);
    }
  }
}
```
### 解法
mapを利用してカードの数を数える、カードの数が3枚のカードを出力する。
## B - Matrix Transposition
[B - Matrix Transposition](https://atcoder.jp/contests/abc237/tasks/abc237_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll h,w;
  cin >> h >> w;
  vector<vector<ll>> a(h, vector<ll>(w));
  vector<vector<ll>> b(w, vector<ll>(h));
  rep(i,h){
    rep(j,w){
      cin >> a[i][j];
    }
  }
  rep(i,w){
    rep(j,h){
      b[i][j] = a[j][i];
      cout << b[i][j] << " ";
    }
    cout << endl;
  }
}
```
### 解法
配列を入れ替えて出力する。今回は配列を入力用と出力用の二つ用意して入れ替えた。

## C - Swiss-System Tournament
[C - Swiss-System Tournament](https://atcoder.jp/contests/abc222/tasks/abc222_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<string>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

bool desc_asc(pair<int, int>& left, pair<int, int>& right) {
  if (left.first == right.first) {
    return left.second < right.second;
  } else {
    return right.first < left.first;
  }
}

int main() {
  ll n, m;
  cin >> n >> m;
  vec a(2*n);
  vector<pair<int,int>> res(2*n);
  rep(i,2*n) {
    cin >> a[i];
    res[i].second = i;
  }
  for(int i=0;i<m;i++){
    for(int j=0;j<n;j++){
      ll x = res[2*j].second;
      ll y = res[2*j+1].second;
      if (a[x][i] == a[y][i]) continue;
      else if (a[x][i] == 'G' && a[y][i] == 'C') res[2*j].first++;
      else if (a[x][i] == 'C' && a[y][i] == 'P') res[2*j].first++;
      else if (a[x][i] == 'P' && a[y][i] == 'G') res[2*j].first++;
      else res[2*j+1].first++;
    }
    sort(res.begin(),res.end(), desc_asc);
  }
  for(auto ans:res){
    cout << ans.second + 1 << endl;
  }
}
```
### 解説
人の番号と勝利数を入れておくpairの配列を利用して解いた。firstに勝利数、secondに番号を入れておく。pair配列のfirst(勝利数)を降順、firstが同値の時second(番号)を昇順にソートしたいので[こちらの記事](https://hiroms-blog.com/entries/vetor-pair-sort-varieties)を参考に実装した。

### 参考文献
[C++ vector<pair>のソートいろいろ 競プロ覚書](https://hiroms-blog.com/entries/vetor-pair-sort-varieties)