michimani.net

パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301) #ABC301

2024-01-06

パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301) の A/B/C 問題の解法。

実装はこちら atcoder/abc/301-400/301 · michimani/atcoder

A - Overall Winner

A - Overall Winner

\(N\) 文字目までを一文字ずつ読み込んで、 T または A の数が \(\lceil \frac{N}{2} \rceil\) に達した時点で、その時の文字を出力する。

#include <iostream>

using namespace std;
using ui = unsigned int;

int main()
{
  ui n;
  cin >> n;

  ui w = n / 2 + n % 2;

  ui t = 0, a = 0;
  for (ui i = 0; i < n; i++)
  {
    char c;
    cin >> c;

    t += ui(c == 'T');
    a += ui(c == 'A');

    if (t == w || a == w)
    {
      cout << c << endl;
      return 0;
    }
  }

  // noop
  return 0;
}

提出 #49055954 - パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)

B - Fill the Gaps

B - Fill the Gaps

\(A_i\) を順番に読み込んでいく際に、 \(A_{i-1}\) との差が \(2\) 以上ある場合は、条件に従って \(A_{i-1}\) から \(A_i\) までの整数を出力していく。

#include <iostream>

using namespace std;
using ui = unsigned int;

int main()
{
  ui n;
  cin >> n;

  int prev = 0;
  for (ui i = 0; i < n; i++)
  {
    int a;
    cin >> a;

    if (prev == 0 || abs(a - prev) == 1)
    {
      if (i > 0)
      {
        cout << " ";
      }
      cout << a;
      prev = a;
      continue;
    }

    if (a > prev)
    {
      for (int aa = prev + 1; aa <= a; aa++)
      {
        cout << " " << aa;
      }
    }
    else
    {
      for (int aa = prev - 1; aa >= a; aa--)
      {
        cout << " " << aa;
      }
    }

    prev = a;
  }

  cout << endl;

  return 0;
}

提出 #49041831 - パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)

C - AtCoder Cards

C - AtCoder Cards

文字列 \(S, T\) について、下記の情報を記録する。

cm の key (= 出現する文字) に対して、 \(S, T\) それぞれに出現する回数を比較する。

途中で No を出力した場合は終了するので、最後までループが回った場合は Yes を出力する。

#include <iostream>
#include <map>
#include <set>

using namespace std;
using ui = unsigned int;

int main()
{
  string s, t;
  cin >> s >> t;

  const set<char> atcoder = {'a', 't', 'c', 'o', 'd', 'e', 'r'};

  map<char, int> sm;
  map<char, int> tm;
  map<char, bool> cm;

  for (ui i = 0; i < s.size(); i++)
  {
    sm[s[i]]++;
    tm[t[i]]++;

    if (s[i] != '@')
    {
      cm[s[i]] = true;
    }
    if (t[i] != '@')
    {
      cm[t[i]] = true;
    }
  }

  int ac = sm['@'] + tm['@'];

  auto it = cm.begin();
  while (it != cm.end())
  {
    int d = abs(sm[it->first] - tm[it->first]);
    if (d != 0)
    {
      if (!atcoder.contains(it->first) || ac < d)
      {
        cout << "No" << endl;
        return 0;
      }

      ac -= d;
    }

    it++;
  }

  cout << "Yes" << endl;
  return 0;
}

提出 #49052672 - パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)


comments powered by Disqus