たなしょのメモ

日々勉強していることをつらつらと

C - Alchemist

はじめに

たなしょです。

今回はこちらのブログを参考にしました。

問題文

https://atcoder.jp/contests/abc138/tasks/abc138_c

考え方

ここまでは動的配列を確保し、各配列に値を格納している。

int N;
cin >> N;

vector<double> v(N);

for (int i = 0; i < N; i++) {
    cin >> v[i];
}

配列を昇順にソートする。

sort(v.begin(), v.end());

変数ansに配列の最大値と2番目に大きな数を足して、2.0のn-1乗を割った数を代入する。

double ans = (v[0] + v[1]) / pow(2.0, N - 1);

変数ansに配列の中身の数 / 2.0のN-i乗を代入する。

for (int i = 2; i < N; i++) {
    ans += v[i] / pow(2.0, N - i);
}

いざ実装

#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#include <cmath>

typedef long long ll;

using namespace std;

int main() {

    int N;
    cin >> N;

    vector<double> v(N);

    for (int i = 0; i < N; i++) {
        cin >> v[i];
    }

    sort(v.begin(), v.end());

    double ans = (v[0] + v[1]) / pow(2.0, N - 1);

    for (int i = 2; i < N; i++) {
        ans += v[i] / pow(2.0, N - i);
    }

    cout << ans << endl;

    return 0;
}

最後に

正直完璧に理解できてはいないです。

最後まで読んでいただいてありがとうございました。 もしよろしければtwitterアカウント(@piklus100yen)もフォローしていただけると幸いです!