michimani.net

AtCoder Beginner Contest 247 #ABC247

2024-01-18

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

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

A - Move Right

A - Move Right

\(S\) をビット列として受け取り、 1 回だけ右シフトした値を出力する。

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
  bitset<4> s;
  cin >> s;

  s >>= 1;
  cout << s << endl;
  return 0;
}

提出 #49377255 - AtCoder Beginner Contest 247

B - Unique Nicknames

B - Unique Nicknames

人 \(i\) を下記の構造体で記録しつつ、 \(s_i, t_i\) それぞれの出現回数を map<string, ui> でカウントする。

struct Name
{
  string s;
  string t;
};

人 \(i\) について下記の条件に合致するものが存在した場合はその時点で No を出力して終了する。

上記の条件に合致する人がいなかった場合は Yes を出力して終了する。

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

using namespace std;
using ui = unsigned int;

struct Name
{
  string s;
  string t;
};

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

  map<string, ui> ac;
  vector<Name> ns(n);
  for (auto &n : ns)
  {
    cin >> n.s >> n.t;
    ac[n.s]++;
    ac[n.t]++;
  }

  for (auto &n : ns)
  {
    if ((n.s != n.t && ac[n.s] != 1 && ac[n.t] != 1) ||
        (n.s == n.t && ac[n.s] > 2))
    {
      cout << "No" << endl;
      return 0;
    }
  }

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

提出 #49377175 - AtCoder Beginner Contest 247

C - 1 2 1 3 1 2 1

C - 1 2 1 3 1 2 1

\(S_n\) を生成する関数を実装し、その再帰呼び出して \(S_N\) を生成する。 再帰呼び出しの終了条件は \(n=1\) のときで、そのときの値は \(1\) とする。

#include <iostream>

using namespace std;
using ui = unsigned int;

string sn(ui n)
{
  if (n == 1)
  {
    return "1";
  }

  string snn = sn(n - 1);
  return snn + " " + to_string(n) + " " + snn;
}

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

  cout << sn(n) << endl;
  return 0;
}

提出 #49376766 - AtCoder Beginner Contest 247

D - Cylinder

D - Cylinder

各ボールを下記の構造体で表すことにする。

struct Ball
{
  ull x;  // 書かれている数
  ull c;  // 筒に入れられた個数
};

筒を list<Ball> cy で表現し、 \(query_q (1 \leq q \leq Q)\)に対して次の処理を行う。

1 x c

2 c

#include <iostream>
#include <list>

using namespace std;
using ui = unsigned int;
using ull = unsigned long long;

struct Ball
{
  ull x;
  ull c;
};

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

  list<Ball> cy;
  for (ui i = 0; i < q; i++)
  {
    ui cmd;
    cin >> cmd;

    ull x = 0, c = 0, sum = 0;
    switch (cmd)
    {
    case 1:
      cin >> x >> c;
      cy.push_back({x, c});
      break;

    case 2:
      cin >> c;
      while (c > 0)
      {
        if (cy.front().c > c)
        {
          sum += cy.front().x * c;
          cy.front().c -= c;
          c = 0;
        }
        else
        {
          c -= cy.front().c;
          sum += cy.front().x * cy.front().c;
          cy.pop_front();
        }
      }

      cout << sum << endl;

      break;

    default:
      // noop
      break;
    }
  }

  return 0;
}

提出 #49381128 - AtCoder Beginner Contest 247


comments powered by Disqus