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++ と同じロジックをすっきりと書けています。

    ABC291 について、引き続き、E問題まで紹介します。

    COMMENT

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

    CAPTCHA