michimani.net

AtCoder Beginner Contest 265 #ABC265

2023-12-28

AtCoder Beginner Contest 265 の A/B/C 問題の解法。

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

A - Apple

A - Apple

\(X\) 円のりんごを \(0 \leq x \leq N\) 個買うとして(実装上は xc)、 \(N-x\) が 3 で割り切れる場合は \(Y\) 円のりんごを \(\frac{N-x}{3}\) 個買うことになる。このときの合計金額を順に計算して、最小値を出力する。

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
  int x, y, n;
  cin >> x >> y >> n;

  int ans = 10000;
  for (int xc = 0; xc <= n; xc++)
  {
    int yc = n - xc;
    if (yc % 3 != 0)
    {
      continue;
    }

    ans = min(ans, x * xc + y * (yc / 3));
  }

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

提出 #48891427 - AtCoder Beginner Contest 265

B - Explore

B - Explore

移動コストを長さ \(N\)、 ボーナスタイムを長さ \(N+1\) の配列でそれぞれ保持する。初期値 \(0\) 。 (ボーナスタイムの配列も長さ \(N\) で足りるが、タイムを足すところで out of index にならないようにするため \(N+1\) にしている)

現在地 \(p = 1\) から始めて、 \(T \leq A_p\) または \( p=N\) になるまでループを回す。ループの中で、現在地 \(p\) での移動コストを \(T\) から引いて、 \(p\) をインクリメントする。インクリメントしたあとにボーナスタイムを足す。最後に、現在地が \(N\) になっていれば Yes を、そうでなければ No を出力する。

移動する際、 \(T\) が \(0\) 以下 になるような移動ができない点に注意。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
  unsigned int n, m, t;
  cin >> n >> m >> t;

  vector<unsigned int> a(n, 0);
  vector<unsigned int> b(n + 1, 0);

  for (unsigned int i = 1; i < n; i++)
  {
    cin >> a[i];
  }

  for (unsigned int i = 0; i < m; i++)
  {
    unsigned int x;
    unsigned int y;
    cin >> x >> y;
    b[x] = y;
  }

  unsigned int p = 1;
  while (true)
  {
    if (t <= a[p] || p == n)
    {
      break;
    }

    t -= a[p];
    p++;
    t += b[p];
  }

  if (p == n)
  {
    cout << "Yes" << endl;
  }
  else
  {
    cout << "No" << endl;
  }

  return 0;
}

提出 #48891376 - AtCoder Beginner Contest 265

C - Belt Conveyor

C - Belt Conveyor

既に訪れた座標と、重複して訪れた回数を保持するようにする。 重複して訪れた座標の数が既に訪れた座標の数以上になったら、収束しないと判断する。

収束しないと判断してループを抜けた場合は -1 を出力して終了。 問題の条件によって収束した場合は、最後に訪れた座標を出力して終了。

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

using namespace std;

string key(vector<unsigned int> p)
{
  return to_string(p[0]) + "-" + to_string(p[1]);
}

int main()
{
  unsigned int h, w;
  cin >> h >> w;

  map<string, bool> visited;
  vector<vector<char>> g(h + 2, vector<char>(w + 2, '.'));

  for (unsigned int hi = 1; hi <= h; hi++)
  {
    for (unsigned int wi = 1; wi <= w; wi++)
    {
      cin >> g[hi][wi];
    }
  }

  vector<unsigned int> p = {1, 1};
  unsigned int times = 0;
  bool loop = false;
  while (true)
  {
    string k = key(p);
    if (visited[k])
    {
      times++;
      if (times >= visited.size())
      {
        loop = true;
        break;
      }
    }

    visited[k] = true;

    if (g[p[0]][p[1]] == 'U' && p[0] != 1)
    {
      p[0]--;
      continue;
    }

    if (g[p[0]][p[1]] == 'D' && p[0] != h)
    {
      p[0]++;
      continue;
    }

    if (g[p[0]][p[1]] == 'L' && p[1] != 1)
    {
      p[1]--;
      continue;
    }

    if (g[p[0]][p[1]] == 'R' && p[1] != w)
    {
      p[1]++;
      continue;
    }

    break;
  }

  if (loop)
  {
    cout << "-1" << endl;
    return 0;
  }

  cout << p[0] << " " << p[1] << endl;
  return 0;
}

提出 #48891201 - AtCoder Beginner Contest 265


comments powered by Disqus