日本レジストリサービス(JPRS)プログラミングコンテスト2024(AtCoder Beginner Contest 339) の A/B/C 問題の解法 #ABC339
2024-02-09日本レジストリサービス(JPRS)プログラミングコンテスト2024(AtCoder Beginner Contest 339) の A/B/C 問題の解法。
実装はこちら atcoder/abc/301-400/339 · michimani/atcoder
A - TLD
\(S\) の各文字をを先頭から見ていき結合する。 . が現れたら結合していた文字列を空文字列に戻す。最終的に残った文字列を出力する。
#include <iostream>
using namespace std;
int main()
{
  string s;
  cin >> s;
  string ans = "";
  for (auto c : s)
  {
    if (c == '.')
    {
      ans = "";
    }
    else
    {
      ans += c;
    }
  }
  cout << ans << endl;
  return 0;
}
提出 #49915057 - 日本レジストリサービス(JPRS)プログラミングコンテスト2024(AtCoder Beginner Contest 339)
B - Langton’s Takahashi
グリッドはトーラス状 = 上下左右の端はループしているので、移動時の座標に気をつけて順次移動しつつマスの色を変えていく。
#include <iostream>
#include <vector>
using namespace std;
using ui = unsigned int;
int main()
{
  ui h, w, n;
  cin >> h >> w >> n;
  vector<string> g(h, string(w, '.'));
  ui i = 0, j = 0;
  char prev = 'U';
  for (ui k = 0; k < n; k++)
  {
    if (g[j][i] == '.')
    {
      g[j][i] = '#';
      switch (prev)
      {
      case 'U':
        i = (i + 1) % w;
        prev = 'R';
        break;
      case 'R':
        j = (j + 1) % h;
        prev = 'D';
        break;
      case 'D':
        i = (i + w - 1) % w;
        prev = 'L';
        break;
      case 'L':
        j = (j + h - 1) % h;
        prev = 'U';
        break;
      default:
        // noop
        break;
      }
    }
    else
    {
      g[j][i] = '.';
      switch (prev)
      {
      case 'U':
        i = (i + w - 1) % w;
        prev = 'L';
        break;
      case 'L':
        j = (j + 1) % h;
        prev = 'D';
        break;
      case 'D':
        i = (i + 1) % w;
        prev = 'R';
        break;
      case 'R':
        j = (j + h - 1) % h;
        prev = 'U';
        break;
      default:
        // noop
        break;
      }
    }
  }
  for (auto hh : g)
  {
    for (auto ww : hh)
    {
      cout << ww;
    }
    cout << endl;
  }
  return 0;
}
提出 #49938181 - 日本レジストリサービス(JPRS)プログラミングコンテスト2024(AtCoder Beginner Contest 339)
C - Perfect Bus
与えられる増減 \(A_1, A_2, \dots ,A_N\) を素直に足し合わていくと、その過程で値が \(0\) を下回ることがある。バスの乗客は \(0\) 人未満になることはないので、そのような場合は初期時点で少なくとも \(その値の絶対値\) 人の乗客が乗っている必要があることがわかる。 \(N\) 回分の増減チェックを行いながら、そのような乗客数を初期時点の乗客数に加えていくことで、最終的な乗客数を求めることができる。
#include <iostream>
using namespace std;
using ui = unsigned int;
int main()
{
  ui n;
  cin >> n;
  long u = 0;
  long adj_u = 0;
  long init = 0;
  for (ui i = 0; i < n; i++)
  {
    long a;
    cin >> a;
    u += a;
    adj_u += a;
    if (adj_u < 0)
    {
      init += abs(adj_u);
      adj_u = 0;
    }
  }
  cout << u + init << endl;
  return 0;
}
提出 #49940623 - 日本レジストリサービス(JPRS)プログラミングコンテスト2024(AtCoder Beginner Contest 339)