えんじにあ備忘録

脱よわよわエンジニアを目指すブログ

AtCoder Beginner Contest 301 に参加しました&反省会

AtCoder Beginner Contest 301 の振り返り

  • A問題しか解けず
  • A問題:勝数が同数の場合、先に勝ったほうが総合勝者となる。これを文字列の末尾のプレイヤーの負けになると最後まで気づけなかった
  • B問題:ベクターに要素を挿入する処理の実装ができず。この処理は一度しか行わないので、実際に挿入せずとも差分を逐一出力するだけだったはず。手順は一度だけと気付くのが遅い。
  • C問題:atcoder@を同一変数で数え上げたのが間違いだった。それぞれの出現回数の差分を@の個数より多いかで判断できた

A問題

atcoder.jp

方針

  • 与えられた文字列から各人の勝利数を算出します。
  • 勝利数が同数の場合、文字列最後の勝者が負けになります。

解説から

  • 最後のchar('T' + 'A' - s.back()) はそれぞれの文字に対応する数値で計算してから再度数値を文字に変換します
#include<bits/stdc++.h>

using namespace std;

int main() {
    int n;
    string s;
    cin >> n >> s;
    
    int t = 0, a = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == 'T') ++t;
        else ++a;
    }
    
    if (t > a) cout << 'T' << endl;
    else if (t < a) cout << 'A' << endl;
    else cout << char('T' + 'A' - s.back()) << endl;
}

B問題

atcoder.jp

方針

  • 2つの項を連続する数値で埋めるよう出力します。
  • 問題文の手順のようにベクターの要素を後ろにずらして挿入する必要はありません。
#include<bits/stdc++.h>
using namespace std;


int main () {

  int N;
  cin >> N;
  vector<int> A;
  for (int i = 0; i < N; i++) {
    int a;
    cin >> a;
    A.push_back(a);
  }
  
  for (int i = 0; i < (int)A.size(); i++) {
      if (A[i+1] > A[i]) {
        for (int j = A[i]; j < A[i+1]; j++) cout << j << " ";
      } else {
        for (int k = A[i]; k > A[i+1]; k--) cout << k << " ";
      }
  }
  cout << A[N-1] << endl;


  return 0;
}

C問題

atcoder.jp

方針

  •  S, Tの文字列に含まれる@a.t.c.o.d.e.rを数え上げます
  • 同じ文字同士の差の和が@よりも小さければ 2つの文字列は同じものだと見なし、Yesを出力します。
  • ただし、各々の文字列で@a.t.c.o.d.e.r以外の文字の個数が一致しない場合Noを出力します。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = INT_MAX / 2;

int main () {

  string S, T;
  cin >> S >> T;
  map<char, int> Smp;
  map<char, int> Tmp;
  for (auto si : S) Smp[si]++;
  for (auto ti : T) Tmp[ti]++;


  bool flag = true;

  int countS = 0;
  int countT = 0;
  int countS_at = 0;
  int countT_at = 0;
  for (auto ch : "abcdefghijklmnopqrstuvwxyz@") {
    string st = string() + ch;
    string str = "atcoder";
    if (st.find("@") != string::npos) {
      countS_at = Smp[ch];
      countT_at = Tmp[ch];
    } else if (str.find(st) != string::npos) {
      if (Smp[ch] > Tmp[ch]) countT += (Smp[ch] - Tmp[ch]);
      else countS += (Tmp[ch] - Smp[ch]);
    } else {
      if (Smp[ch] != Tmp[ch]) flag = false;
    }
  }

  if (countS_at < countS || countT_at < countT) flag = false;

  cout << (flag ? "Yes" : "No") << endl;

  return 0;
}