michimani.net

東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 299) #ABC299

2024-01-08

東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 299) の A/B/C 問題の解法。

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

A - Treasure Chest

A - Treasure Chest

\(S\) を一文字ずつ読み込んでいき、 | の数をカウントする。読み込んだ文字が * のとき、 | の数が \(1\) であれば in を出力して終了。それ以外であれば out を出力して終了する。

#include <iostream>

using namespace std;
using ui = unsigned int;

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

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

    if (c == '|')
    {
      bc++;
      continue;
    }

    if (c == '*')
    {
      if (bc == 1)
      {
        cout << "in" << endl;
      }
      else
      {
        cout << "out" << endl;
      }
      return 0;
    }
  }

  // noop
  return 0;
}

提出 #49148908 - 東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 299)

B - Trick Taking

B - Trick Taking

\(C\) ごとにプレイヤーをグループ化して、 \(T\) に属するプレイヤーがいればそのグループ内で、いなければ \(C_1\) のグループ内で最大の値を出しているプレイヤーの番号を出力する。

プレイヤーを表す構造体 Player を定義して、フィールドとして \(i, C_i, R_i\) を保持する。

\(C\) ごとのグループ化は map<ui, vector<Player>> で行う。

\(T\) または \(C_1\) グループの vector<Player>Player.r で降順にソートして、先頭のプレイヤーの番号を出力する。

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

using namespace std;
using ui = unsigned int;

struct Player
{
  ui no;
  ui c;
  ui r;
};

bool comp(Player &l, Player &r)
{
  return l.r < r.r;
}

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

  vector<Player> p(n);
  map<ui, vector<Player>> cp;

  for (ui i = 0; i < n; i++)
  {
    ui c;
    cin >> c;
    p[i].no = i + 1;
    p[i].c = c;
  }

  for (ui i = 0; i < n; i++)
  {
    ui r;
    cin >> r;
    p[i].r = r;
  }

  for (auto &pp : p)
  {
    cp[pp.c].push_back(pp);
  }

  if (cp.count(t) == 0)
  {
    t = p[0].c;
  }

  vector<Player> cand = cp[t];

  sort(cand.rbegin(), cand.rend(), comp);

  cout << cand[0].no << endl;
  return 0;
}

提出 #49148828 - 東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 299)

C - Dango

C - Dango

\(S\) を一文字ずつ読み込んで、 o が連続する数をカウントする。読み込んが文字が - 且つその時点での o の数が \(1\) 以上の場合、連続する o の数を保持する配列に追加し、 o のカウントを \(0\) にする。

\(S\) の最後が o の場合に備えて、読み込みのループが抜けたあとで o のカウントが \(1\) 以上 且つ \(N\) 未満の場合は、連続する o の数を保持する配列に追加する。

配列の要素数が \(0\) の場合は -1 を出力して終了。

配列の要素数が \(1\) 以上の場合は、配列を降順でソートして \(0\) 番目の要素を出力して終了。

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

using namespace std;
using ui = unsigned int;

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

  vector<ui> dc;

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

    if (c == 'o')
    {
      d++;
    }
    else if (c == '-' && d > 0)
    {
      dc.push_back(d);
      d = 0;
    }
  }

  if (0 < d && d < n)
  {
    dc.push_back(d);
  }

  sort(dc.rbegin(), dc.rend());

  if (dc.size() == 0)
  {
    cout << "-1" << endl;
    return 0;
  }

  cout << dc[0] << endl;
  return 0;
}

提出 #49148005 - 東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 299)


comments powered by Disqus