AtCoder

ABC323 B問題(Round-Robin Tournament)を解く

AtCoder_ABC323_B

AtCoder が提供しているABC(AtCoder Beginner Contest)323 のB問題をC++とPythonで解いてみました。ABC323は、2023年10月7日21:00に実施されました。

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

B問題 Round-Robin Tournament(Difficulty : 75)

問題はリンク先をご覧ください。

ABC323 B問題 Round-Robin Tournament

ソートの仕方を工夫します。AtCoder Problems による Difficulty は、75 でした。※2023年10月15日 Difficulty を追記しました。

解答案

C++ プログラム例(ABC323B)

勝ち数については多い順に、勝ち数が同じ場合はプレイヤーの番号が小さい順にプレイヤー番号を出力します。sort は、第3引数を指定しなければ値が小さい順にソートします。

勝ち数とプレイヤーの番号を pair で組にします。勝ち数は多い順にソートしたいため、マイナスをつけて pair に登録します(21行目)。これで題意に沿ったソートができます(23行目)。

以下が、C++プログラムとなります。

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int n;
	cin >> n;
	vector<string> s(n);
	for (int i = 0; i < n; ++i) {
		cin >> s[i];
	}

	vector<pair<int, int>> a(n);
	for (int i = 0; i < n; ++i) {
		int win = 0;
		for (int j = 0; j < n; ++j) {
			if (s[i][j] == 'o') {
				++win;
			}
		}
		a[i] = make_pair(-win, i + 1);
	}
	sort(a.begin(), a.end());

	for (int i = 0; i < n; ++i) {
		cout << a[i].second << " \n"[i == n - 1];
	}

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC323B)

Python 版も基本的な考え方は同じです。結果の出力では、タプルの2番目の要素でリストを作り、* をつけて出力しています(14行目)。

"""AtCoder Beginner Contest 323 B"""
n = int(input())
s = [input() for i in range(n)]

a = []
for i in range(n):
    win = 0
    for j in range(n):
        if s[i][j] == 'o':
            win += 1
    a.append((-win, i + 1))
a.sort()

print(*[i for _, i in a])

こちらも「AC」と判定されました。

最後に

ABC308C問題の解法2で紹介したように比較関数を作ってソートする方法でも解くことができます。今回は、プログラムが簡単に書ける方法を採用しました。

引き続き ABC の問題を紹介していきます。

COMMENT

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

CAPTCHA