パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301) #ABC301
2024-01-06パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301) の A/B/C 問題の解法。
実装はこちら atcoder/abc/301-400/301 · michimani/atcoder 。
A - Overall Winner
\(N\) 文字目までを一文字ずつ読み込んで、 T
または A
の数が \(\lceil \frac{N}{2} \rceil\) に達した時点で、その時の文字を出力する。
#include <iostream>
using namespace std;
using ui = unsigned int;
int main()
{
ui n;
cin >> n;
ui w = n / 2 + n % 2;
ui t = 0, a = 0;
for (ui i = 0; i < n; i++)
{
char c;
cin >> c;
t += ui(c == 'T');
a += ui(c == 'A');
if (t == w || a == w)
{
cout << c << endl;
return 0;
}
}
// noop
return 0;
}
提出 #49055954 - パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)
B - Fill the Gaps
\(A_i\) を順番に読み込んでいく際に、 \(A_{i-1}\) との差が \(2\) 以上ある場合は、条件に従って \(A_{i-1}\) から \(A_i\) までの整数を出力していく。
#include <iostream>
using namespace std;
using ui = unsigned int;
int main()
{
ui n;
cin >> n;
int prev = 0;
for (ui i = 0; i < n; i++)
{
int a;
cin >> a;
if (prev == 0 || abs(a - prev) == 1)
{
if (i > 0)
{
cout << " ";
}
cout << a;
prev = a;
continue;
}
if (a > prev)
{
for (int aa = prev + 1; aa <= a; aa++)
{
cout << " " << aa;
}
}
else
{
for (int aa = prev - 1; aa >= a; aa--)
{
cout << " " << aa;
}
}
prev = a;
}
cout << endl;
return 0;
}
提出 #49041831 - パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)
C - AtCoder Cards
文字列 \(S, T\) について、下記の情報を記録する。
- \(S\) に含まれる各文字の出現回数 …
map<char, int> sm
- \(T\) に含まれる各文字の出現回数 …
map<char, int> tm
- \(S, T\) に含まれる
@
以外の 文字の集合 …map<char, bool> cm
- \(S, T\) に含まれる
@
の出現回数 …int ac
cm
の key (= 出現する文字) に対して、 \(S, T\) それぞれに出現する回数を比較する。
- 出現回数が同じ場合は何もしない
- 出現回数が異なる場合
- 対象の文字が
atcoder
に含まれない、またはac
が出現回数の差分より小さい場合はNo
を出力して終了 - 上記以外の場合、
ac
から出現回数の差分を引く
- 対象の文字が
途中で No
を出力した場合は終了するので、最後までループが回った場合は Yes
を出力する。
#include <iostream>
#include <map>
#include <set>
using namespace std;
using ui = unsigned int;
int main()
{
string s, t;
cin >> s >> t;
const set<char> atcoder = {'a', 't', 'c', 'o', 'd', 'e', 'r'};
map<char, int> sm;
map<char, int> tm;
map<char, bool> cm;
for (ui i = 0; i < s.size(); i++)
{
sm[s[i]]++;
tm[t[i]]++;
if (s[i] != '@')
{
cm[s[i]] = true;
}
if (t[i] != '@')
{
cm[t[i]] = true;
}
}
int ac = sm['@'] + tm['@'];
auto it = cm.begin();
while (it != cm.end())
{
int d = abs(sm[it->first] - tm[it->first]);
if (d != 0)
{
if (!atcoder.contains(it->first) || ac < d)
{
cout << "No" << endl;
return 0;
}
ac -= d;
}
it++;
}
cout << "Yes" << endl;
return 0;
}
提出 #49052672 - パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)
comments powered by Disqus