AtCoder

ABC384 C問題(Perfect Standings)を解く

AtCoder_ABC384_C

AtCoder が提供しているABC(AtCoder Beginner Contest)384 C問題をC++とPythonで解いてみました。ABC384は、2024年12月14日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

C問題 Perfect Standings(Difficulty : 187)

問題の詳細は、リンク先をご覧ください。

ABC384 C問題 Perfect Standings

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 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA