AtCoder

ABC291 B問題(Trimmed Mean)を解く

AtCoder_ABC291_B

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

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

B問題 Trimmed Mean(Difficulty : 32)

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

ABC291 B問題 Trimmed Mean

ソートして前後を除いて平均を求める問題です。AtCoder Problems による Difficulty は 32 でした。

解答案

問題を以下の方針で解きます。

  • N と数列 X を読み込む。
  • X をソートする。
  • X の前後をN個分抜いて、合計を求める。
  • 合計を3Nで割って平均を求めて、その平均を出力する。

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

前後のN個分を抜いて、中にある3N個の要素をfor文を使って求めています(15行目)。浮動小数点数を出力する場合は、iostream よりも printf の方が楽に感じます(20行目)。

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

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

int main()
{
	int n;
	cin >> n;
	vector<int> x(5 * n);
	for (int i = 0; i < 5 * n; ++i) {
		cin >> x[i];
	}
	sort(x.begin(), x.end());

	double sum = 0.0;
	for (int i = n; i < 4 * n; ++i) {
		sum += x[i];
	}

	double result = sum / (3.0 * (double)n);
	printf("%.6lf\n", result);

	return 0;
}

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

Python プログラム例(ABC291B)

Python は、C++ 版と同じく、リストをソートした後、スライス記法とsumにより、中にある3N個の要素の合計を求めることができます(6行目)。浮動小数点数は、f文字列を使いました。

"""AtCoder Beginner Contest 291 B"""
n = int(input())
x = list(map(float, input().split()))
x.sort()

result = sum(x[n:4 * n]) / (3.0 * n)
print(f"{result:.6f}")

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

最後に

Python は、リストが使いやすく、C++ と同じロジックをすっきりと書けています。

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

COMMENT

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

CAPTCHA