michimani.net

トヨタ自動車プログラミングコンテスト2023#8(AtCoder Beginner Contest 333) #ABC333

2023-12-20

問題 - トヨタ自動車プログラミングコンテスト2023#8(AtCoder Beginner Contest 333) の A/B/C 問題の解法。

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

A - Three Threes

A - Three Threes

特筆する点はなし。

提出 #48533797 - トヨタ自動車プログラミングコンテスト2023#8(AtCoder Beginner Contest 333)

B - Pentagon

B - Pentagon

考えられる距離は 1 (隣同士) とそれ以外の 2 通り。与えられた 2 辺について各頂点の整数値の差がともに 1 かどうか、またはともに 1 以外かどうかを判定する。

#include <iostream>

using namespace std;

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

  if (
      (abs(s[0] - s[1]) % 3 == 1 && abs(t[0] - t[1]) % 3 == 1) ||
      (abs(s[0] - s[1]) % 3 != 1 && abs(t[0] - t[1]) % 3 != 1))
  {
    cout << "Yes" << endl;
  }
  else
  {
    cout << "No" << endl;
  }

  return 0;
}

提出 #48663727 - トヨタ自動車プログラミングコンテスト2023#8(AtCoder Beginner Contest 333)

C - Repunit Trio

C - Repunit Trio

\(N \leq 333\) で、例題から最大のレピュニット数が \(111111111111\) (=12桁) であることがわかる。このことから、 12 種類のレピュニット数から重複を許して 3 つを選んで合計した値をあらかじめ生成・ソートしておき、 \(N\) 番目の値を出力すればよい。

値の生成は \(12^3\) であることから、全探索で十分間に合う。

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>

using namespace std;

int main()
{
  vector<unsigned long long> choices = {1};
  for (unsigned int d = 1; d <= 12; d++)
  {
    choices.push_back(choices[d - 1] * 10 + 1);
  }

  vector<unsigned long long> list;
  map<unsigned long long, bool> exists;
  for (auto &c : choices)
  {
    for (auto &cc : choices)
    {
      for (auto &ccc : choices)
      {
        unsigned long long num = c + cc + ccc;
        if (!exists[num])
        {
          list.push_back(num);
          exists[num] = true;
        }
      }
    }
  }

  sort(list.begin(), list.end());

  unsigned int n;
  cin >> n;

  cout << list[n - 1] << endl;

  return 0;
}

提出 #48663623 - トヨタ自動車プログラミングコンテスト2023#8(AtCoder Beginner Contest 333)


comments powered by Disqus