michimani.net

AtCoder Beginner Contest 033 #ABC033

2024-01-09

AtCoder Beginner Contest 033 の A/B/C 問題の解説。

実装はこちら atcoder/abc/001-100/033 · michimani/atcoder

A - 暗証番号

A - 暗証番号

4 桁の数字を一文字ずつ読み込んで、ひとつ前の文字と異なっていれば DIFFERENT を出力して終了。最後まで読み込み終えられたら SAME を出力して終了する。

#include <iostream>

using namespace std;
using ui = unsigned int;

int main()
{
  char prev = '.';
  for (ui i = 0; i < 4; i++)
  {
    char c;
    cin >> c;
    if (i > 0 && c != prev)
    {
      cout << "DIFFERENT" << endl;
      return 0;
    }

    prev = c;
  }

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

提出 #49165072 - AtCoder Beginner Contest 033

B - 町の合併

B - 町の合併

\(S_i, P_i\) を読み込みつつ、それぞれを key,value にした map と、 \(P_i\) の合計 \(sum\) を記録する。

\(h = \lfloor \frac{sum}{2} \rfloor\) として、 \(P_i > h\) であるような \(i\) が存在する場合、その時の \(S_i\) を出力して終了。そうでなければ atcoder を出力して終了する。

#include <iostream>
#include <map>

using namespace std;
using ui = unsigned int;

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

  map<string, ui> sp;
  ui sum = 0;
  for (ui i = 0; i < n; i++)
  {
    string s;
    ui p;
    cin >> s >> p;

    sum += p;
    sp[s] = p;
  }

  ui h = sum / 2;

  auto it = sp.begin();
  while (it != sp.end())
  {
    if (it->second > h)
    {
      cout << it->first << endl;
      return 0;
    }
    it++;
  }

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

提出 #49165029 - AtCoder Beginner Contest 033

C - 数式の書き換え

C - 数式の書き換え

\(S\) を先頭から一文字ずつ見ていく過程で、その文字を \(d\) とすると、 \(d\) が + または * である場合とそれ以外とで処理をわける。

現在の演算を mode で保持するようにして、 \(d\) が + または * の場合は mode を更新する。

\(d\) が + または * でない場合は、 mode に応じて次の処理を行う。また、ひとつ前の項に関する情報を \(tmp\) で、最終的な答えを \(ans\) で保持する。

ループを抜けたあと、 \(tmp \gt 0\) の場合に \(ans\) をインクリメントする。

最後に \(ans\) を出力して終了する。

#include <iostream>

using namespace std;
using ui = unsigned int;

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

  ui tmp = 0;
  char mode = '+';
  ui ans = 0;
  for (auto &d : s)
  {
    if (d == '+' || d == '*')
    {
      mode = d;
      continue;
    }

    ui num = ui(d - '0');
    if (mode == '+')
    {
      ans += ui(tmp > 0);
      tmp = num;
    }
    else if (mode == '*')
    {
      tmp = ui(tmp > 0 && num > 0);
    }
    else
    {
      // noop
    }
  }

  ans += ui(tmp > 0);

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

提出 #49164783 - AtCoder Beginner Contest 033


comments powered by Disqus