michimani.net

日本レジストリサービス(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

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

B - Langton&rsquo;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

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)


comments powered by Disqus