michimani.net

マイナビプログラミングコンテスト 2021(AtCoder Beginner Contest 201) の A/B/C 問題の解法 #ABC201

2024-02-14

マイナビプログラミングコンテスト 2021(AtCoder Beginner Contest 201) の A/B/C 問題の解法。

実装はこちら atcoder/abc/201-300/201 · michimani/atcoder

A - Tiny Arithmetic Sequence

A - Tiny Arithmetic Sequence

与えられる 3 つの整数を配列に保持してソートし、隣り合う 2 つの差が等しいかどうかを判定する。

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

using namespace std;
using ui = unsigned int;

int main()
{
  vector<ui> a(3, 0);
  for (auto &aa : a)
  {
    cin >> aa;
  }

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

  cout << (a[2] - a[1] == a[1] - a[0] ? "Yes" : "No") << endl;
  return 0;
}

提出 #50269193 - マイナビプログラミングコンテスト 2021(AtCoder Beginner Contest 201)

B - Do you know the second highest mountain?

B - Do you know the second highest mountain?

それぞれの山の高さはすべて相異なることが保証されているので、 \(T_i\) を key 、 \(S_i\) を value として map に保持し、その中で 2 番目に大きい値を取得する。

C++ の std:map は key の昇順でソートされているので、 ++m.rbegin() で 2 番目に大きい値を取得できる。

#include <iostream>
#include <map>

using namespace std;
using ui = unsigned int;

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

  map<ui, string> ts;
  for (; n--;)
  {
    string s;
    ui t;
    cin >> s >> t;
    ts[t] = s;
  }

  cout << (++ts.rbegin())->second << endl;
  return 0;
}

提出 #50269460 - マイナビプログラミングコンテスト 2021(AtCoder Beginner Contest 201)

C - Secret Number

C - Secret Number

o となっている数字は すべて 使用されること、桁数が \(4\) であることから、考えられるすべての組み合わせについて o となっている数字がすべて使用されているものを数える方法で解ける。

その際、 以下のどちらかの場合は \(0\) 通りとなるので早期リターンできる。

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;
using ui = unsigned int;

int main()
{
  vector<char> in, all;
  ui pr = 0;
  for (ui i = 0; i < 10; i++)
  {
    char c;
    cin >> c;
    if (c == 'o')
    {
      in.push_back(char(i - '0'));
      all.push_back(char(i - '0'));
    }
    else if (c == '?')
    {
      pr++;
      all.push_back(char(i - '0'));
    }
  }

  if (in.size() > 4 || (in.size() + pr == 0))
  {
    cout << 0 << endl;
    return 0;
  }

  vector<string> sv;
  string tmp = "";
  ui ans = 0;
  bool ok = false;
  for (auto &d1 : all)
  {
    for (auto &d2 : all)
    {
      for (auto &d3 : all)
      {
        for (auto &d4 : all)
        {
          tmp = {d1, d2, d3, d4};
          ok = true;
          for (auto &i : in)
          {
            if (tmp.find(i) == string::npos)
            {
              ok = false;
              break;
            }
          }
          ans += ui(ok);
        }
      }
    }
  }

  cout << ans << endl;
  return 0;
}

提出 #50268856 - マイナビプログラミングコンテスト 2021(AtCoder Beginner Contest 201)


comments powered by Disqus