はじめに
たなしょです。
今回はこちらのブログを参考にしました。
問題文
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)もフォローしていただけると幸いです!