加算の方が大きくなるのは 2 以下だった気がするので、下限が 1.5 だとある数字の加算が 1 度しか行われないことになる。
また、乗算はそれぞれの数字の差が小さい方が結果が大きくなる。
小さい方から、ある範囲をそれと隣接する範囲へ逆順に加算し、総乗する。
class Nisoku {
public:
double theMax(vector <double> v)
{
const int N = v.size();
sort(v.begin(), v.end());
double mx = -1;
for (int i = 0; i * 2 <= N; ++i) {
double n = 1;
const int M = i * 2;
vector<double> a, b, c;
for (int j = 0; j < N; ++j) {
if (j < M) {
a.push_back(v[j]);
b.push_back(v[j]);
} else {
c.push_back(v[j]);
}
}
reverse(b.begin(), b.end());
for (int j = 0; j < i; ++j) {
n *= a[j] + b[j];
}
for (int j = 0; j < c.size(); ++j) {
n *= c[j];
}
mx = max(mx, n);
}
return mx;
}
};