AtCoder が提供しているABC(AtCoder Beginner Contest)384 C問題をC++とPythonで解いてみました。ABC384は、2024年12月14日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
C問題 Perfect Standings(Difficulty : 187)
問題の詳細は、リンク先をご覧ください。
2つの要素を片方は降順で、もう一方を昇順でソートします。AtCoder Problems による Difficulty は 187 でした。
解答案
C++ プログラム例(ABC384C)
参加者数は31名で固定されています。bit全探索を使って点数と名前を31名分処理します。
点数は高い順(降順)に、名前は辞書順(文字コードの昇順)にソートする必要があります。今回は、点数にマイナスをつけて名前と合わせて昇順にソートしました。
以下が、C++プログラムです。
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector<int> a(5);
for (int i = 0; i < 5; ++i) {
cin >> a[i];
}
vector<pair<int, string>> result;
for (int i = 1; i < 32; ++i) {
int t_sum = 0;
string name = "";
for (int j = 0; j < 5; ++j) {
if ((i & (1 << j)) != 0) {
t_sum += a[j];
name += (char)('A' + j);
}
}
result.push_back(make_pair(-t_sum, name));
}
sort(result.begin(), result.end());
for (int i = 0; i < (int)result.size(); ++i) {
cout << result[i].second << endl;
}
return 0;
}
AC(Accepted=正しいプログラム)と判定されました。
Python プログラム例(ABC384C)
Python版も基本的な考え方は同じです。以下がプログラムです。
"""AtCoder Beginner Contest 384 C"""
a = list(map(int, input().split()))
result = []
for i in range(1, 32):
t_sum = 0
name = ""
for j in range(5):
if (i & (1 << j)) != 0:
t_sum += a[j]
name += chr(ord('A') + j)
result.append((-t_sum, name))
result.sort()
for e in result:
print(e[1])
こちらも「AC」と判定されました。
最後に
単純に降順ソートのみを行ったため、WA(Wrong Answer)となりました。入力例でも間違いが分かるため、もったいなかったです。
引き続き ABC の問題を紹介していきます。