AtCoder Beginner Contest 265 #ABC265
2023-12-28AtCoder Beginner Contest 265 の A/B/C 問題の解法。
実装はこちら atcoder/abc/201-300/265 · michimani/atcoder
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
移動コストを長さ \(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
既に訪れた座標と、重複して訪れた回数を保持するようにする。 重複して訪れた座標の数が既に訪れた座標の数以上になったら、収束しないと判断する。
収束しないと判断してループを抜けた場合は -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