AtCoder Beginner Contest 033 #ABC033
2024-01-09AtCoder Beginner Contest 033 の A/B/C 問題の解説。
実装はこちら atcoder/abc/001-100/033 · michimani/atcoder
A - 暗証番号
4 桁の数字を一文字ずつ読み込んで、ひとつ前の文字と異なっていれば DIFFERENT
を出力して終了。最後まで読み込み終えられたら SAME
を出力して終了する。
#include <iostream>
using namespace std;
using ui = unsigned int;
int main()
{
char prev = '.';
for (ui i = 0; i < 4; i++)
{
char c;
cin >> c;
if (i > 0 && c != prev)
{
cout << "DIFFERENT" << endl;
return 0;
}
prev = c;
}
cout << "SAME" << endl;
return 0;
}
提出 #49165072 - AtCoder Beginner Contest 033
B - 町の合併
\(S_i, P_i\) を読み込みつつ、それぞれを key,value にした map と、 \(P_i\) の合計 \(sum\) を記録する。
\(h = \lfloor \frac{sum}{2} \rfloor\) として、 \(P_i > h\) であるような \(i\) が存在する場合、その時の \(S_i\) を出力して終了。そうでなければ atcoder
を出力して終了する。
#include <iostream>
#include <map>
using namespace std;
using ui = unsigned int;
int main()
{
ui n;
cin >> n;
map<string, ui> sp;
ui sum = 0;
for (ui i = 0; i < n; i++)
{
string s;
ui p;
cin >> s >> p;
sum += p;
sp[s] = p;
}
ui h = sum / 2;
auto it = sp.begin();
while (it != sp.end())
{
if (it->second > h)
{
cout << it->first << endl;
return 0;
}
it++;
}
cout << "atcoder" << endl;
return 0;
}
提出 #49165029 - AtCoder Beginner Contest 033
C - 数式の書き換え
\(S\) を先頭から一文字ずつ見ていく過程で、その文字を \(d\) とすると、 \(d\) が +
または *
である場合とそれ以外とで処理をわける。
現在の演算を mode
で保持するようにして、 \(d\) が +
または *
の場合は mode
を更新する。
\(d\) が +
または *
でない場合は、 mode
に応じて次の処理を行う。また、ひとつ前の項に関する情報を \(tmp\) で、最終的な答えを \(ans\) で保持する。
-
mode
が*
の場合\(tmp \gt 0\) かつ \(d \gt 0\) の場合に \(ans\) をインクリメントする。その後、 \(tmp\) を \(tmp \times d\) で更新するが、今回の問題では計算結果を気にする必要はないので \(tmp \times d \gt 0\) ならば \(1\) で、そうでなければ \(0\) で更新する。
-
mode
が+
の場合\(tmp \gt 0\) の場合に \(ans\) をインクリメントする。その後、 \(tmp\) を \(d\) で更新する。
ループを抜けたあと、 \(tmp \gt 0\) の場合に \(ans\) をインクリメントする。
最後に \(ans\) を出力して終了する。
#include <iostream>
using namespace std;
using ui = unsigned int;
int main()
{
string s;
cin >> s;
ui tmp = 0;
char mode = '+';
ui ans = 0;
for (auto &d : s)
{
if (d == '+' || d == '*')
{
mode = d;
continue;
}
ui num = ui(d - '0');
if (mode == '+')
{
ans += ui(tmp > 0);
tmp = num;
}
else if (mode == '*')
{
tmp = ui(tmp > 0 && num > 0);
}
else
{
// noop
}
}
ans += ui(tmp > 0);
cout << ans << endl;
return 0;
}
提出 #49164783 - AtCoder Beginner Contest 033
comments powered by Disqus