AtCoder が提供しているABC(AtCoder Beginner Contest)291 のB問題をC++とPythonで解いてみました。ABC291は、2023年2月26日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Trimmed Mean(Difficulty : 32)
問題はリンク先をご覧ください。
ソートして前後を除いて平均を求める問題です。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 の問題を紹介していきます。